@workplane/dbos 0.3.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/README.md +35 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +102 -0
- package/dist/index.js.map +1 -0
- package/package.json +35 -0
package/README.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# @workplane/dbos
|
|
2
|
+
|
|
3
|
+
Optional DBOS durability layer for the workplane server. Wraps store operations in durable DBOS workflows so the control plane survives process crashes and replays in-flight operations.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @workplane/dbos @workplane/types @dbos-inc/dbos-sdk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
Enable by setting `WORKPLANE_USE_DBOS=true` before starting the workplane server — no code changes needed. The server dynamically imports this package and swaps `VanillaWorkflows` for `DbosWorkflows`.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
WORKPLANE_USE_DBOS=true workplane-server
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Programmatic use
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import { createDbosWorkflows } from "@workplane/dbos";
|
|
23
|
+
|
|
24
|
+
const workflows = createDbosWorkflows(store); // store satisfies ServerWorkflows
|
|
25
|
+
await workflows.launch({
|
|
26
|
+
appName: "my-app",
|
|
27
|
+
systemDatabaseUrl: process.env.DATABASE_URL,
|
|
28
|
+
});
|
|
29
|
+
// workflows now implements ServerWorkflows with DBOS durability
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Requirements
|
|
33
|
+
|
|
34
|
+
- Postgres (for DBOS system tables, separate from the workplane app schema)
|
|
35
|
+
- `DBOS_APPLICATION_NAME` env var (optional, defaults to `workplane-server`)
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ServerWorkflows, CreateTaskInput, TaskRecord, RunStatus, RunRecord, RunLogInput, ArtifactInput, ArtifactRecord, AppendInputEventInput, RunInputEvent } from '@workplane/types';
|
|
2
|
+
|
|
3
|
+
declare class DbosWorkflows implements ServerWorkflows {
|
|
4
|
+
private readonly registered;
|
|
5
|
+
constructor(store: ServerWorkflows);
|
|
6
|
+
launch(options: {
|
|
7
|
+
appName: string;
|
|
8
|
+
systemDatabaseUrl: string;
|
|
9
|
+
conductorKey?: string;
|
|
10
|
+
conductorUrl?: string;
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
shutdown(): Promise<void>;
|
|
13
|
+
createTask(input: CreateTaskInput): Promise<TaskRecord>;
|
|
14
|
+
retryTask(taskId: string): Promise<TaskRecord | null>;
|
|
15
|
+
cancelTask(taskId: string): Promise<TaskRecord | null>;
|
|
16
|
+
updateRunStatus(runId: string, status: RunStatus, error?: string): Promise<RunRecord | null>;
|
|
17
|
+
appendRunLogs(runId: string, logs: RunLogInput[]): Promise<number>;
|
|
18
|
+
createArtifact(runId: string, input: ArtifactInput): Promise<ArtifactRecord>;
|
|
19
|
+
appendInputEvent(runId: string, input: AppendInputEventInput): Promise<RunInputEvent>;
|
|
20
|
+
markInputDelivered(runId: string, sequence: number): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
declare function createDbosWorkflows(store: ServerWorkflows): DbosWorkflows;
|
|
23
|
+
|
|
24
|
+
export { DbosWorkflows, createDbosWorkflows };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
import { DBOS } from "@dbos-inc/dbos-sdk";
|
|
3
|
+
var DbosWorkflows = class {
|
|
4
|
+
registered;
|
|
5
|
+
constructor(store) {
|
|
6
|
+
const createTask = DBOS.registerWorkflow(
|
|
7
|
+
async (input) => DBOS.runStep(() => store.createTask(input), { name: "store-create-task" }),
|
|
8
|
+
{ name: "createTaskWorkflow" }
|
|
9
|
+
);
|
|
10
|
+
const retryTask = DBOS.registerWorkflow(
|
|
11
|
+
async (taskId) => DBOS.runStep(() => store.retryTask(taskId), { name: "store-retry-task" }),
|
|
12
|
+
{ name: "retryTaskWorkflow" }
|
|
13
|
+
);
|
|
14
|
+
const cancelTask = DBOS.registerWorkflow(
|
|
15
|
+
async (taskId) => DBOS.runStep(() => store.cancelTask(taskId), { name: "store-cancel-task" }),
|
|
16
|
+
{ name: "cancelTaskWorkflow" }
|
|
17
|
+
);
|
|
18
|
+
const updateRunStatus = DBOS.registerWorkflow(
|
|
19
|
+
async (runId, status, error) => DBOS.runStep(() => store.updateRunStatus(runId, status, error), { name: "store-update-run-status" }),
|
|
20
|
+
{ name: "updateRunStatusWorkflow" }
|
|
21
|
+
);
|
|
22
|
+
const appendRunLogs = DBOS.registerWorkflow(
|
|
23
|
+
async (runId, logs) => DBOS.runStep(() => store.appendRunLogs(runId, logs), { name: "store-append-run-logs" }),
|
|
24
|
+
{ name: "appendRunLogsWorkflow" }
|
|
25
|
+
);
|
|
26
|
+
const createArtifact = DBOS.registerWorkflow(
|
|
27
|
+
async (runId, input) => DBOS.runStep(() => store.createArtifact(runId, input), { name: "store-create-artifact" }),
|
|
28
|
+
{ name: "createArtifactWorkflow" }
|
|
29
|
+
);
|
|
30
|
+
const appendInputEvent = DBOS.registerWorkflow(
|
|
31
|
+
async (runId, input) => DBOS.runStep(() => store.appendInputEvent(runId, input), { name: "store-append-input-event" }),
|
|
32
|
+
{ name: "appendInputEventWorkflow" }
|
|
33
|
+
);
|
|
34
|
+
const markInputDelivered = DBOS.registerWorkflow(
|
|
35
|
+
async (runId, sequence) => DBOS.runStep(() => store.markInputDelivered(runId, sequence), { name: "store-mark-input-delivered" }),
|
|
36
|
+
{ name: "markInputDeliveredWorkflow" }
|
|
37
|
+
);
|
|
38
|
+
this.registered = {
|
|
39
|
+
createTask,
|
|
40
|
+
retryTask,
|
|
41
|
+
cancelTask,
|
|
42
|
+
updateRunStatus,
|
|
43
|
+
appendRunLogs,
|
|
44
|
+
createArtifact,
|
|
45
|
+
appendInputEvent,
|
|
46
|
+
markInputDelivered
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
async launch(options) {
|
|
50
|
+
DBOS.setConfig({
|
|
51
|
+
name: options.appName,
|
|
52
|
+
systemDatabaseUrl: options.systemDatabaseUrl
|
|
53
|
+
});
|
|
54
|
+
await DBOS.launch({
|
|
55
|
+
conductorKey: options.conductorKey,
|
|
56
|
+
conductorURL: options.conductorUrl
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async shutdown() {
|
|
60
|
+
await DBOS.shutdown();
|
|
61
|
+
}
|
|
62
|
+
async createTask(input) {
|
|
63
|
+
const handle = await DBOS.startWorkflow(this.registered.createTask)(input);
|
|
64
|
+
return handle.getResult();
|
|
65
|
+
}
|
|
66
|
+
async retryTask(taskId) {
|
|
67
|
+
const handle = await DBOS.startWorkflow(this.registered.retryTask)(taskId);
|
|
68
|
+
return handle.getResult();
|
|
69
|
+
}
|
|
70
|
+
async cancelTask(taskId) {
|
|
71
|
+
const handle = await DBOS.startWorkflow(this.registered.cancelTask)(taskId);
|
|
72
|
+
return handle.getResult();
|
|
73
|
+
}
|
|
74
|
+
async updateRunStatus(runId, status, error) {
|
|
75
|
+
const handle = await DBOS.startWorkflow(this.registered.updateRunStatus)(runId, status, error);
|
|
76
|
+
return handle.getResult();
|
|
77
|
+
}
|
|
78
|
+
async appendRunLogs(runId, logs) {
|
|
79
|
+
const handle = await DBOS.startWorkflow(this.registered.appendRunLogs)(runId, logs);
|
|
80
|
+
return handle.getResult();
|
|
81
|
+
}
|
|
82
|
+
async createArtifact(runId, input) {
|
|
83
|
+
const handle = await DBOS.startWorkflow(this.registered.createArtifact)(runId, input);
|
|
84
|
+
return handle.getResult();
|
|
85
|
+
}
|
|
86
|
+
async appendInputEvent(runId, input) {
|
|
87
|
+
const handle = await DBOS.startWorkflow(this.registered.appendInputEvent)(runId, input);
|
|
88
|
+
return handle.getResult();
|
|
89
|
+
}
|
|
90
|
+
async markInputDelivered(runId, sequence) {
|
|
91
|
+
const handle = await DBOS.startWorkflow(this.registered.markInputDelivered)(runId, sequence);
|
|
92
|
+
await handle.getResult();
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
function createDbosWorkflows(store) {
|
|
96
|
+
return new DbosWorkflows(store);
|
|
97
|
+
}
|
|
98
|
+
export {
|
|
99
|
+
DbosWorkflows,
|
|
100
|
+
createDbosWorkflows
|
|
101
|
+
};
|
|
102
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { DBOS } from \"@dbos-inc/dbos-sdk\";\nimport type {\n AppendInputEventInput,\n ArtifactInput,\n ArtifactRecord,\n CreateTaskInput,\n RunInputEvent,\n RunLogInput,\n RunRecord,\n RunStatus,\n ServerWorkflows,\n TaskRecord,\n} from \"@workplane/types\";\n\nexport class DbosWorkflows implements ServerWorkflows {\n private readonly registered: ServerWorkflows;\n\n constructor(store: ServerWorkflows) {\n const createTask = DBOS.registerWorkflow(\n async (input: CreateTaskInput) =>\n DBOS.runStep(() => store.createTask(input), { name: \"store-create-task\" }),\n { name: \"createTaskWorkflow\" },\n );\n\n const retryTask = DBOS.registerWorkflow(\n async (taskId: string) =>\n DBOS.runStep(() => store.retryTask(taskId), { name: \"store-retry-task\" }),\n { name: \"retryTaskWorkflow\" },\n );\n\n const cancelTask = DBOS.registerWorkflow(\n async (taskId: string) =>\n DBOS.runStep(() => store.cancelTask(taskId), { name: \"store-cancel-task\" }),\n { name: \"cancelTaskWorkflow\" },\n );\n\n const updateRunStatus = DBOS.registerWorkflow(\n async (runId: string, status: RunStatus, error?: string) =>\n DBOS.runStep(() => store.updateRunStatus(runId, status, error), { name: \"store-update-run-status\" }),\n { name: \"updateRunStatusWorkflow\" },\n );\n\n const appendRunLogs = DBOS.registerWorkflow(\n async (runId: string, logs: RunLogInput[]) =>\n DBOS.runStep(() => store.appendRunLogs(runId, logs), { name: \"store-append-run-logs\" }),\n { name: \"appendRunLogsWorkflow\" },\n );\n\n const createArtifact = DBOS.registerWorkflow(\n async (runId: string, input: ArtifactInput) =>\n DBOS.runStep(() => store.createArtifact(runId, input), { name: \"store-create-artifact\" }),\n { name: \"createArtifactWorkflow\" },\n );\n\n const appendInputEvent = DBOS.registerWorkflow(\n async (runId: string, input: AppendInputEventInput) =>\n DBOS.runStep(() => store.appendInputEvent(runId, input), { name: \"store-append-input-event\" }),\n { name: \"appendInputEventWorkflow\" },\n );\n\n const markInputDelivered = DBOS.registerWorkflow(\n async (runId: string, sequence: number) =>\n DBOS.runStep(() => store.markInputDelivered(runId, sequence), { name: \"store-mark-input-delivered\" }),\n { name: \"markInputDeliveredWorkflow\" },\n );\n\n this.registered = {\n createTask,\n retryTask,\n cancelTask,\n updateRunStatus,\n appendRunLogs,\n createArtifact,\n appendInputEvent,\n markInputDelivered,\n };\n }\n\n async launch(options: {\n appName: string;\n systemDatabaseUrl: string;\n conductorKey?: string;\n conductorUrl?: string;\n }): Promise<void> {\n DBOS.setConfig({\n name: options.appName,\n systemDatabaseUrl: options.systemDatabaseUrl,\n });\n await DBOS.launch({\n conductorKey: options.conductorKey,\n conductorURL: options.conductorUrl,\n });\n }\n\n async shutdown(): Promise<void> {\n await DBOS.shutdown();\n }\n\n async createTask(input: CreateTaskInput): Promise<TaskRecord> {\n const handle = await DBOS.startWorkflow(this.registered.createTask)(input);\n return handle.getResult();\n }\n\n async retryTask(taskId: string): Promise<TaskRecord | null> {\n const handle = await DBOS.startWorkflow(this.registered.retryTask)(taskId);\n return handle.getResult();\n }\n\n async cancelTask(taskId: string): Promise<TaskRecord | null> {\n const handle = await DBOS.startWorkflow(this.registered.cancelTask)(taskId);\n return handle.getResult();\n }\n\n async updateRunStatus(runId: string, status: RunStatus, error?: string): Promise<RunRecord | null> {\n const handle = await DBOS.startWorkflow(this.registered.updateRunStatus)(runId, status, error);\n return handle.getResult();\n }\n\n async appendRunLogs(runId: string, logs: RunLogInput[]): Promise<number> {\n const handle = await DBOS.startWorkflow(this.registered.appendRunLogs)(runId, logs);\n return handle.getResult();\n }\n\n async createArtifact(runId: string, input: ArtifactInput): Promise<ArtifactRecord> {\n const handle = await DBOS.startWorkflow(this.registered.createArtifact)(runId, input);\n return handle.getResult();\n }\n\n async appendInputEvent(runId: string, input: AppendInputEventInput): Promise<RunInputEvent> {\n const handle = await DBOS.startWorkflow(this.registered.appendInputEvent)(runId, input);\n return handle.getResult();\n }\n\n async markInputDelivered(runId: string, sequence: number): Promise<void> {\n const handle = await DBOS.startWorkflow(this.registered.markInputDelivered)(runId, sequence);\n await handle.getResult();\n }\n}\n\nexport function createDbosWorkflows(store: ServerWorkflows): DbosWorkflows {\n return new DbosWorkflows(store);\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@workplane/dbos",
|
|
3
|
+
"version": "0.3.1",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/MindStaq/workplane.git"
|
|
10
|
+
},
|
|
11
|
+
"main": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"import": "./dist/index.js",
|
|
16
|
+
"types": "./dist/index.d.ts"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"README.md"
|
|
22
|
+
],
|
|
23
|
+
"sideEffects": false,
|
|
24
|
+
"publishConfig": {
|
|
25
|
+
"access": "public",
|
|
26
|
+
"registry": "https://registry.npmjs.org/"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@dbos-inc/dbos-sdk": "^4.18.10",
|
|
30
|
+
"@workplane/types": "0.3.1"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsup"
|
|
34
|
+
}
|
|
35
|
+
}
|