@renderinc/sdk 0.2.1 → 0.4.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 +159 -42
- package/dist/experimental/experimental.d.ts +2 -2
- package/dist/experimental/experimental.d.ts.map +1 -1
- package/dist/experimental/experimental.js +4 -4
- package/dist/experimental/object/api.d.ts +2 -1
- package/dist/experimental/object/api.d.ts.map +1 -1
- package/dist/experimental/object/api.js +20 -3
- package/dist/experimental/object/client.d.ts +11 -5
- package/dist/experimental/object/client.d.ts.map +1 -1
- package/dist/experimental/object/client.js +78 -13
- package/dist/experimental/object/e2e-helpers.d.ts +3 -0
- package/dist/experimental/object/e2e-helpers.d.ts.map +1 -0
- package/dist/experimental/object/e2e-helpers.js +70 -0
- package/dist/experimental/object/index.d.ts +1 -1
- package/dist/experimental/object/index.d.ts.map +1 -1
- package/dist/experimental/object/types.d.ts +18 -0
- package/dist/experimental/object/types.d.ts.map +1 -1
- package/dist/generated/schema.d.ts +167 -28
- package/dist/generated/schema.d.ts.map +1 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +3 -1
- package/dist/workflows/client/client.d.ts +7 -3
- package/dist/workflows/client/client.d.ts.map +1 -1
- package/dist/workflows/client/client.js +96 -15
- package/dist/workflows/client/index.d.ts +2 -0
- package/dist/workflows/client/index.d.ts.map +1 -1
- package/dist/workflows/client/index.js +5 -1
- package/dist/workflows/client/sse.d.ts +0 -7
- package/dist/workflows/client/sse.d.ts.map +1 -1
- package/dist/workflows/client/sse.js +1 -71
- package/dist/workflows/client/task-run-promise.d.ts +12 -0
- package/dist/workflows/client/task-run-promise.d.ts.map +1 -0
- package/dist/workflows/client/task-run-promise.js +22 -0
- package/dist/workflows/client/task-run-result.d.ts +10 -0
- package/dist/workflows/client/task-run-result.d.ts.map +1 -0
- package/dist/workflows/client/task-run-result.js +18 -0
- package/dist/workflows/client/types.d.ts +2 -0
- package/dist/workflows/client/types.d.ts.map +1 -1
- package/dist/workflows/uds.d.ts +1 -0
- package/dist/workflows/uds.d.ts.map +1 -1
- package/dist/workflows/uds.js +30 -2
- package/dist/workflows/workflows.d.ts +19 -0
- package/dist/workflows/workflows.d.ts.map +1 -0
- package/dist/workflows/workflows.js +51 -0
- package/package.json +5 -1
- package/CHANGELOG.md +0 -33
- package/biome.json +0 -84
- package/examples/client/main.ts +0 -42
- package/examples/client/package-lock.json +0 -601
- package/examples/client/package.json +0 -16
- package/examples/client/tsconfig.json +0 -17
- package/examples/task/main.ts +0 -90
- package/examples/task/package-lock.json +0 -584
- package/examples/task/package.json +0 -16
- package/examples/task/tsconfig.json +0 -17
- package/src/errors.test.ts +0 -75
- package/src/errors.ts +0 -73
- package/src/experimental/experimental.ts +0 -56
- package/src/experimental/index.ts +0 -24
- package/src/experimental/object/api.ts +0 -91
- package/src/experimental/object/client.test.ts +0 -138
- package/src/experimental/object/client.ts +0 -317
- package/src/experimental/object/index.ts +0 -22
- package/src/experimental/object/types.test.ts +0 -87
- package/src/experimental/object/types.ts +0 -131
- package/src/generated/schema.ts +0 -12937
- package/src/index.ts +0 -7
- package/src/render.ts +0 -35
- package/src/utils/create-api-client.ts +0 -13
- package/src/utils/get-base-url.test.ts +0 -58
- package/src/utils/get-base-url.ts +0 -16
- package/src/version.ts +0 -37
- package/src/workflows/client/client.test.ts +0 -68
- package/src/workflows/client/client.ts +0 -142
- package/src/workflows/client/create-client.ts +0 -17
- package/src/workflows/client/index.ts +0 -3
- package/src/workflows/client/sse.ts +0 -95
- package/src/workflows/client/types.ts +0 -56
- package/src/workflows/executor.ts +0 -124
- package/src/workflows/index.ts +0 -7
- package/src/workflows/registry.test.ts +0 -76
- package/src/workflows/registry.ts +0 -88
- package/src/workflows/runner.ts +0 -38
- package/src/workflows/schema.ts +0 -348
- package/src/workflows/task.ts +0 -117
- package/src/workflows/types.test.ts +0 -52
- package/src/workflows/types.ts +0 -89
- package/src/workflows/uds.ts +0 -139
- package/test-types.ts +0 -14
- package/tsconfig.build.json +0 -4
- package/tsconfig.json +0 -23
- package/vitest.config.ts +0 -8
package/dist/render.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAIpE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAKjE,qBAAa,MAAM;IACjB,SAAgB,SAAS,EAAE,eAAe,CAAC;IAC3C,SAAgB,YAAY,EAAE,kBAAkB,CAAC;IAEjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;gBAM9B,OAAO,CAAC,EAAE,aAAa;
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAIpE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAKjE,qBAAa,MAAM;IACjB,SAAgB,SAAS,EAAE,eAAe,CAAC;IAC3C,SAAgB,YAAY,EAAE,kBAAkB,CAAC;IAEjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;gBAM9B,OAAO,CAAC,EAAE,aAAa;CAepC"}
|
package/dist/render.js
CHANGED
|
@@ -15,7 +15,9 @@ class Render {
|
|
|
15
15
|
const baseUrl = (0, get_base_url_js_1.getBaseUrl)(options);
|
|
16
16
|
this.apiClient = (0, create_api_client_js_1.createApiClient)(baseUrl, token);
|
|
17
17
|
this.workflows = new index_js_1.WorkflowsClient(this.apiClient, baseUrl, token);
|
|
18
|
-
|
|
18
|
+
const defaultOwnerId = options?.ownerId || process.env.RENDER_WORKSPACE_ID || undefined;
|
|
19
|
+
const defaultRegion = options?.region || process.env.RENDER_REGION || undefined;
|
|
20
|
+
this.experimental = new experimental_js_1.ExperimentalClient(this.apiClient, defaultOwnerId, defaultRegion);
|
|
19
21
|
}
|
|
20
22
|
}
|
|
21
23
|
exports.Render = Render;
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import type { Client as ApiClient } from "openapi-fetch";
|
|
2
2
|
import type { paths } from "../../generated/schema.js";
|
|
3
|
+
import { TaskRunResult } from "./task-run-result.js";
|
|
3
4
|
import type { ListTaskRunsParams, TaskData, TaskIdentifier, TaskRun, TaskRunDetails } from "./types.js";
|
|
4
5
|
export declare class WorkflowsClient {
|
|
5
|
-
private readonly sse;
|
|
6
6
|
private readonly apiClient;
|
|
7
|
+
private readonly baseUrl;
|
|
8
|
+
private readonly token;
|
|
7
9
|
constructor(apiClient: ApiClient<paths>, baseUrl: string, token: string);
|
|
10
|
+
taskRunEvents(taskRunIds: string[], signal?: AbortSignal): AsyncGenerator<TaskRunDetails>;
|
|
11
|
+
startTask(taskIdentifier: TaskIdentifier, inputData: TaskData, signal?: AbortSignal): Promise<TaskRunResult>;
|
|
8
12
|
runTask(taskIdentifier: TaskIdentifier, inputData: TaskData, signal?: AbortSignal): Promise<TaskRunDetails>;
|
|
9
|
-
private waitForTask;
|
|
10
13
|
getTaskRun(taskRunId: string): Promise<TaskRunDetails>;
|
|
11
|
-
|
|
14
|
+
cancelTaskRun(taskRunId: string): Promise<void>;
|
|
12
15
|
listTaskRuns(params: ListTaskRunsParams): Promise<TaskRun[]>;
|
|
16
|
+
private waitOnTaskRun;
|
|
13
17
|
}
|
|
14
18
|
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/workflows/client/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/workflows/client/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,eAAe,CAAC;AAEzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAGvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EACV,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,OAAO,EACP,cAAc,EACf,MAAM,YAAY,CAAC;AAoBpB,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAOnB,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAchE,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC,cAAc,CAAC;IA0G1F,SAAS,CACb,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,QAAQ,EACnB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,CAAC;IA+BnB,OAAO,CACX,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,QAAQ,EACnB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC;IAWpB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IActD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe/C,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAcpD,aAAa;CAM5B"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.WorkflowsClient = void 0;
|
|
4
|
+
const eventsource_1 = require("eventsource");
|
|
4
5
|
const errors_js_1 = require("../../errors.js");
|
|
6
|
+
const version_js_1 = require("../../version.js");
|
|
5
7
|
const sse_js_1 = require("./sse.js");
|
|
8
|
+
const task_run_result_js_1 = require("./task-run-result.js");
|
|
6
9
|
function handleApiError(error, response, context) {
|
|
7
10
|
const statusCode = response.status;
|
|
8
11
|
const errorMessage = `${context}: ${error}`;
|
|
@@ -16,22 +19,97 @@ function handleApiError(error, response, context) {
|
|
|
16
19
|
}
|
|
17
20
|
class WorkflowsClient {
|
|
18
21
|
constructor(apiClient, baseUrl, token) {
|
|
19
|
-
this.sse = new sse_js_1.SSEClient(baseUrl, token);
|
|
20
22
|
this.apiClient = apiClient;
|
|
23
|
+
this.baseUrl = baseUrl;
|
|
24
|
+
this.token = token;
|
|
21
25
|
}
|
|
22
|
-
async
|
|
26
|
+
async *taskRunEvents(taskRunIds, signal) {
|
|
23
27
|
if (signal?.aborted) {
|
|
24
28
|
throw new errors_js_1.AbortError();
|
|
25
29
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
const queue = [];
|
|
31
|
+
let resolve = null;
|
|
32
|
+
let finished = false;
|
|
33
|
+
let streamError = null;
|
|
34
|
+
const push = (item) => {
|
|
35
|
+
queue.push(item);
|
|
36
|
+
if (resolve) {
|
|
37
|
+
resolve();
|
|
38
|
+
resolve = null;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const fail = (err) => {
|
|
42
|
+
streamError = err;
|
|
43
|
+
finished = true;
|
|
44
|
+
if (resolve) {
|
|
45
|
+
resolve();
|
|
46
|
+
resolve = null;
|
|
31
47
|
}
|
|
32
48
|
};
|
|
49
|
+
const url = new URL("/v1/task-runs/events", this.baseUrl);
|
|
50
|
+
url.searchParams.append("taskRunIds", taskRunIds.join(","));
|
|
51
|
+
const eventSource = new eventsource_1.EventSource(url.toString(), {
|
|
52
|
+
fetch: (input, init) => fetch(input, {
|
|
53
|
+
...init,
|
|
54
|
+
headers: {
|
|
55
|
+
...init?.headers,
|
|
56
|
+
Authorization: `Bearer ${this.token}`,
|
|
57
|
+
"User-Agent": (0, version_js_1.getUserAgent)(),
|
|
58
|
+
},
|
|
59
|
+
}),
|
|
60
|
+
});
|
|
61
|
+
const eventHandler = (event) => {
|
|
62
|
+
try {
|
|
63
|
+
const details = JSON.parse(event.data);
|
|
64
|
+
push(details);
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
fail(new Error(`Failed to parse task run details: ${e}`));
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
const errorHandler = (error) => {
|
|
71
|
+
fail(new Error(`SSE connection error: ${error.message || "Unknown error"}`));
|
|
72
|
+
};
|
|
73
|
+
const abortHandler = () => {
|
|
74
|
+
cleanup();
|
|
75
|
+
fail(new errors_js_1.AbortError());
|
|
76
|
+
};
|
|
77
|
+
const cleanup = () => {
|
|
78
|
+
eventSource.removeEventListener(sse_js_1.TaskEventType.COMPLETED, eventHandler);
|
|
79
|
+
eventSource.removeEventListener(sse_js_1.TaskEventType.FAILED, eventHandler);
|
|
80
|
+
eventSource.removeEventListener("error", errorHandler);
|
|
81
|
+
eventSource.close();
|
|
82
|
+
signal?.removeEventListener("abort", abortHandler);
|
|
83
|
+
};
|
|
84
|
+
eventSource.addEventListener(sse_js_1.TaskEventType.COMPLETED, eventHandler);
|
|
85
|
+
eventSource.addEventListener(sse_js_1.TaskEventType.FAILED, eventHandler);
|
|
86
|
+
eventSource.addEventListener("error", errorHandler);
|
|
87
|
+
signal?.addEventListener("abort", abortHandler);
|
|
88
|
+
try {
|
|
89
|
+
while (true) {
|
|
90
|
+
while (queue.length > 0) {
|
|
91
|
+
yield queue.shift();
|
|
92
|
+
}
|
|
93
|
+
if (finished) {
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
await new Promise((r) => {
|
|
97
|
+
resolve = r;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
if (streamError) {
|
|
101
|
+
throw streamError;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
cleanup();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async startTask(taskIdentifier, inputData, signal) {
|
|
109
|
+
if (signal?.aborted) {
|
|
110
|
+
throw new errors_js_1.AbortError();
|
|
111
|
+
}
|
|
33
112
|
try {
|
|
34
|
-
signal?.addEventListener("abort", abortHandler);
|
|
35
113
|
const { data, error, response } = await this.apiClient.POST("/task-runs", {
|
|
36
114
|
body: {
|
|
37
115
|
task: taskIdentifier,
|
|
@@ -42,8 +120,7 @@ class WorkflowsClient {
|
|
|
42
120
|
if (error) {
|
|
43
121
|
handleApiError(error, response, "Failed to run task");
|
|
44
122
|
}
|
|
45
|
-
|
|
46
|
-
return await this.waitForTask(data.id, signal);
|
|
123
|
+
return new task_run_result_js_1.TaskRunResult((id, sig) => this.waitOnTaskRun(id, sig), data.id, signal);
|
|
47
124
|
}
|
|
48
125
|
catch (err) {
|
|
49
126
|
if (err instanceof DOMException && err.name === "AbortError") {
|
|
@@ -51,12 +128,10 @@ class WorkflowsClient {
|
|
|
51
128
|
}
|
|
52
129
|
throw err;
|
|
53
130
|
}
|
|
54
|
-
finally {
|
|
55
|
-
signal?.removeEventListener("abort", abortHandler);
|
|
56
|
-
}
|
|
57
131
|
}
|
|
58
|
-
async
|
|
59
|
-
|
|
132
|
+
async runTask(taskIdentifier, inputData, signal) {
|
|
133
|
+
const result = await this.startTask(taskIdentifier, inputData, signal);
|
|
134
|
+
return result.get();
|
|
60
135
|
}
|
|
61
136
|
async getTaskRun(taskRunId) {
|
|
62
137
|
const { data, error, response } = await this.apiClient.GET("/task-runs/{taskRunId}", {
|
|
@@ -84,5 +159,11 @@ class WorkflowsClient {
|
|
|
84
159
|
}
|
|
85
160
|
return data;
|
|
86
161
|
}
|
|
162
|
+
async waitOnTaskRun(taskRunId, signal) {
|
|
163
|
+
for await (const event of this.taskRunEvents([taskRunId], signal)) {
|
|
164
|
+
return event;
|
|
165
|
+
}
|
|
166
|
+
throw new Error(`SSE stream ended without receiving an event for task run ${taskRunId}`);
|
|
167
|
+
}
|
|
87
168
|
}
|
|
88
169
|
exports.WorkflowsClient = WorkflowsClient;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { WorkflowsClient } from "./client.js";
|
|
2
2
|
export { createWorkflowsClient } from "./create-client.js";
|
|
3
|
+
export { TaskEventType } from "./sse.js";
|
|
4
|
+
export { TaskRunResult } from "./task-run-result.js";
|
|
3
5
|
export * from "./types.js";
|
|
4
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/workflows/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/workflows/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,cAAc,YAAY,CAAC"}
|
|
@@ -14,9 +14,13 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.createWorkflowsClient = exports.WorkflowsClient = void 0;
|
|
17
|
+
exports.TaskRunResult = exports.TaskEventType = exports.createWorkflowsClient = exports.WorkflowsClient = void 0;
|
|
18
18
|
var client_js_1 = require("./client.js");
|
|
19
19
|
Object.defineProperty(exports, "WorkflowsClient", { enumerable: true, get: function () { return client_js_1.WorkflowsClient; } });
|
|
20
20
|
var create_client_js_1 = require("./create-client.js");
|
|
21
21
|
Object.defineProperty(exports, "createWorkflowsClient", { enumerable: true, get: function () { return create_client_js_1.createWorkflowsClient; } });
|
|
22
|
+
var sse_js_1 = require("./sse.js");
|
|
23
|
+
Object.defineProperty(exports, "TaskEventType", { enumerable: true, get: function () { return sse_js_1.TaskEventType; } });
|
|
24
|
+
var task_run_result_js_1 = require("./task-run-result.js");
|
|
25
|
+
Object.defineProperty(exports, "TaskRunResult", { enumerable: true, get: function () { return task_run_result_js_1.TaskRunResult; } });
|
|
22
26
|
__exportStar(require("./types.js"), exports);
|
|
@@ -1,14 +1,7 @@
|
|
|
1
|
-
import type { TaskRunDetails } from "./types.js";
|
|
2
1
|
export declare enum TaskEventType {
|
|
3
2
|
COMPLETED = "task.completed",
|
|
4
3
|
FAILED = "task.failed",
|
|
5
4
|
RUNNING = "task.running",
|
|
6
5
|
PENDING = "task.pending"
|
|
7
6
|
}
|
|
8
|
-
export declare class SSEClient {
|
|
9
|
-
private readonly baseUrl;
|
|
10
|
-
private readonly token;
|
|
11
|
-
constructor(baseUrl: string, token: string);
|
|
12
|
-
waitOnTaskRun(taskRunId: string, signal?: AbortSignal): Promise<TaskRunDetails>;
|
|
13
|
-
}
|
|
14
7
|
//# sourceMappingURL=sse.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../../src/workflows/client/sse.ts"],"names":[],"mappings":"AAGA,
|
|
1
|
+
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../../src/workflows/client/sse.ts"],"names":[],"mappings":"AAGA,oBAAY,aAAa;IACvB,SAAS,mBAAmB;IAC5B,MAAM,gBAAgB;IACtB,OAAO,iBAAiB;IACxB,OAAO,iBAAiB;CACzB"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
const eventsource_1 = require("eventsource");
|
|
5
|
-
const errors_js_1 = require("../../errors.js");
|
|
6
|
-
const version_js_1 = require("../../version.js");
|
|
3
|
+
exports.TaskEventType = void 0;
|
|
7
4
|
var TaskEventType;
|
|
8
5
|
(function (TaskEventType) {
|
|
9
6
|
TaskEventType["COMPLETED"] = "task.completed";
|
|
@@ -11,70 +8,3 @@ var TaskEventType;
|
|
|
11
8
|
TaskEventType["RUNNING"] = "task.running";
|
|
12
9
|
TaskEventType["PENDING"] = "task.pending";
|
|
13
10
|
})(TaskEventType || (exports.TaskEventType = TaskEventType = {}));
|
|
14
|
-
class SSEClient {
|
|
15
|
-
constructor(baseUrl, token) {
|
|
16
|
-
this.baseUrl = baseUrl;
|
|
17
|
-
this.token = token;
|
|
18
|
-
}
|
|
19
|
-
async waitOnTaskRun(taskRunId, signal) {
|
|
20
|
-
return new Promise((resolve, reject) => {
|
|
21
|
-
let eventSource = null;
|
|
22
|
-
const abortHandler = () => {
|
|
23
|
-
cleanup();
|
|
24
|
-
reject(new errors_js_1.AbortError());
|
|
25
|
-
};
|
|
26
|
-
const cleanup = () => {
|
|
27
|
-
if (eventSource) {
|
|
28
|
-
eventSource.removeEventListener(TaskEventType.COMPLETED, eventHandler);
|
|
29
|
-
eventSource.removeEventListener(TaskEventType.FAILED, eventHandler);
|
|
30
|
-
eventSource.removeEventListener("error", errorHandler);
|
|
31
|
-
eventSource.close();
|
|
32
|
-
eventSource = null;
|
|
33
|
-
}
|
|
34
|
-
signal?.removeEventListener("abort", abortHandler);
|
|
35
|
-
};
|
|
36
|
-
const eventHandler = (event) => {
|
|
37
|
-
try {
|
|
38
|
-
const details = JSON.parse(event.data);
|
|
39
|
-
cleanup();
|
|
40
|
-
resolve(details);
|
|
41
|
-
}
|
|
42
|
-
catch (e) {
|
|
43
|
-
cleanup();
|
|
44
|
-
reject(new Error(`Failed to parse task run details: ${e}`));
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
const errorHandler = (error) => {
|
|
48
|
-
cleanup();
|
|
49
|
-
reject(new Error(`SSE connection error: ${error.message || "Unknown error"}`));
|
|
50
|
-
};
|
|
51
|
-
if (signal?.aborted) {
|
|
52
|
-
reject(new errors_js_1.AbortError());
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
signal?.addEventListener("abort", abortHandler);
|
|
56
|
-
try {
|
|
57
|
-
const url = new URL("/v1/task-runs/events", this.baseUrl);
|
|
58
|
-
url.searchParams.append("taskRunIds", taskRunId);
|
|
59
|
-
eventSource = new eventsource_1.EventSource(url.toString(), {
|
|
60
|
-
fetch: (input, init) => fetch(input, {
|
|
61
|
-
...init,
|
|
62
|
-
headers: {
|
|
63
|
-
...init?.headers,
|
|
64
|
-
Authorization: `Bearer ${this.token}`,
|
|
65
|
-
"User-Agent": (0, version_js_1.getUserAgent)(),
|
|
66
|
-
},
|
|
67
|
-
}),
|
|
68
|
-
});
|
|
69
|
-
eventSource.addEventListener(TaskEventType.COMPLETED, eventHandler);
|
|
70
|
-
eventSource.addEventListener(TaskEventType.FAILED, eventHandler);
|
|
71
|
-
eventSource.addEventListener("error", errorHandler);
|
|
72
|
-
}
|
|
73
|
-
catch (e) {
|
|
74
|
-
cleanup();
|
|
75
|
-
reject(e);
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
exports.SSEClient = SSEClient;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SSEClient } from "./sse.js";
|
|
2
|
+
import type { TaskRunDetails } from "./types.js";
|
|
3
|
+
export declare class TaskRunPromise implements PromiseLike<TaskRunDetails> {
|
|
4
|
+
private readonly sseClient;
|
|
5
|
+
private readonly postPromise;
|
|
6
|
+
private readonly signal?;
|
|
7
|
+
private resultPromise;
|
|
8
|
+
constructor(sseClient: SSEClient, postPromise: Promise<string>, signal?: AbortSignal);
|
|
9
|
+
get taskRunId(): Promise<string>;
|
|
10
|
+
then<TResult1 = TaskRunDetails, TResult2 = never>(onfulfilled?: ((value: TaskRunDetails) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null): Promise<TResult1 | TResult2>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=task-run-promise.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-run-promise.d.ts","sourceRoot":"","sources":["../../../src/workflows/client/task-run-promise.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAUjD,qBAAa,cAAe,YAAW,WAAW,CAAC,cAAc,CAAC;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAc;IACtC,OAAO,CAAC,aAAa,CAAwC;gBAEjD,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW;IAUpF,IAAI,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAE/B;IAED,IAAI,CAAC,QAAQ,GAAG,cAAc,EAAE,QAAQ,GAAG,KAAK,EAC9C,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,cAAc,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EAClF,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,GACtE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;CAShC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TaskRunPromise = void 0;
|
|
4
|
+
class TaskRunPromise {
|
|
5
|
+
constructor(sseClient, postPromise, signal) {
|
|
6
|
+
this.resultPromise = null;
|
|
7
|
+
this.sseClient = sseClient;
|
|
8
|
+
this.postPromise = postPromise;
|
|
9
|
+
this.signal = signal;
|
|
10
|
+
this.postPromise.catch(() => { });
|
|
11
|
+
}
|
|
12
|
+
get taskRunId() {
|
|
13
|
+
return this.postPromise;
|
|
14
|
+
}
|
|
15
|
+
then(onfulfilled, onrejected) {
|
|
16
|
+
if (!this.resultPromise) {
|
|
17
|
+
this.resultPromise = this.postPromise.then((taskRunId) => this.sseClient.waitOnTaskRun(taskRunId, this.signal));
|
|
18
|
+
}
|
|
19
|
+
return this.resultPromise.then(onfulfilled, onrejected);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.TaskRunPromise = TaskRunPromise;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { TaskRunDetails } from "./types.js";
|
|
2
|
+
export declare class TaskRunResult {
|
|
3
|
+
readonly taskRunId: string;
|
|
4
|
+
private readonly waitOnTaskRun;
|
|
5
|
+
private readonly signal?;
|
|
6
|
+
private resultPromise;
|
|
7
|
+
constructor(waitOnTaskRun: (taskRunId: string, signal?: AbortSignal) => Promise<TaskRunDetails>, taskRunId: string, signal?: AbortSignal);
|
|
8
|
+
get(): Promise<TaskRunDetails>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=task-run-result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-run-result.d.ts","sourceRoot":"","sources":["../../../src/workflows/client/task-run-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qBAAa,aAAa;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAGD;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAc;IACtC,OAAO,CAAC,aAAa,CAAwC;gBAG3D,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,cAAc,CAAC,EACnF,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,WAAW;IAOtB,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC;CAM/B"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TaskRunResult = void 0;
|
|
4
|
+
class TaskRunResult {
|
|
5
|
+
constructor(waitOnTaskRun, taskRunId, signal) {
|
|
6
|
+
this.resultPromise = null;
|
|
7
|
+
this.waitOnTaskRun = waitOnTaskRun;
|
|
8
|
+
this.taskRunId = taskRunId;
|
|
9
|
+
this.signal = signal;
|
|
10
|
+
}
|
|
11
|
+
get() {
|
|
12
|
+
if (!this.resultPromise) {
|
|
13
|
+
this.resultPromise = this.waitOnTaskRun(this.taskRunId, this.signal);
|
|
14
|
+
}
|
|
15
|
+
return this.resultPromise;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.TaskRunResult = TaskRunResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/workflows/client/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAKhE,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAKpC,MAAM,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;AAKlC,oBAAY,aAAa;IACvB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,SAAS,cAAc;IACvB,MAAM,WAAW;CAClB;AAMD,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC;AAMvD,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,gBAAgB,CAAC,CAAC;AAKrE,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC;AAKnF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,QAAQ,CAAC;CACjB;AAKD,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/workflows/client/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAKhE,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAKpC,MAAM,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;AAKlC,oBAAY,aAAa;IACvB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,SAAS,cAAc;IACvB,MAAM,WAAW;CAClB;AAMD,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC;AAMvD,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,gBAAgB,CAAC,CAAC;AAKrE,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC;AAKnF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,QAAQ,CAAC;CACjB;AAKD,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
package/dist/workflows/uds.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uds.d.ts","sourceRoot":"","sources":["../../src/workflows/uds.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,gBAAgB,EAEhB,wBAAwB,EAIxB,YAAY,EACb,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"uds.d.ts","sourceRoot":"","sources":["../../src/workflows/uds.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,gBAAgB,EAEhB,wBAAwB,EAIxB,YAAY,EACb,MAAM,YAAY,CAAC;AAapB,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,MAAM;IAKzC,QAAQ,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAI3C,OAAO,CAAC,iBAAiB;IAyBnB,YAAY,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO1D,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAa3D,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAUtE,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAa3C,OAAO;YAmCP,WAAW;CA2C1B"}
|
package/dist/workflows/uds.js
CHANGED
|
@@ -6,6 +6,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.UDSClient = void 0;
|
|
7
7
|
const node_http_1 = __importDefault(require("node:http"));
|
|
8
8
|
const version_js_1 = require("../version.js");
|
|
9
|
+
const UDS_MAX_RETRIES = 15;
|
|
10
|
+
const UDS_INITIAL_DELAY_MS = 250;
|
|
11
|
+
const UDS_BACKOFF_FACTOR = 2;
|
|
12
|
+
const UDS_MAX_DELAY_MS = 16000;
|
|
13
|
+
const CLIENT_ERROR_RE = /^HTTP 4\d{2}:/;
|
|
14
|
+
const RETRY_ERROR_RE = /^HTTP 429:/;
|
|
9
15
|
class UDSClient {
|
|
10
16
|
constructor(socketPath) {
|
|
11
17
|
this.socketPath = socketPath;
|
|
@@ -60,13 +66,35 @@ class UDSClient {
|
|
|
60
66
|
await this.request("/register-tasks", "POST", body);
|
|
61
67
|
}
|
|
62
68
|
async request(path, method, body) {
|
|
69
|
+
const bodyString = body ? JSON.stringify(body) : "";
|
|
70
|
+
let lastError = new Error("UDS request failed");
|
|
71
|
+
for (let attempt = 0; attempt < UDS_MAX_RETRIES; attempt++) {
|
|
72
|
+
try {
|
|
73
|
+
return await this.requestOnce(path, method, bodyString);
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
lastError = e instanceof Error ? e : new Error(String(e));
|
|
77
|
+
if (CLIENT_ERROR_RE.test(lastError.message) && !RETRY_ERROR_RE.test(lastError.message)) {
|
|
78
|
+
throw lastError;
|
|
79
|
+
}
|
|
80
|
+
if (attempt < UDS_MAX_RETRIES - 1) {
|
|
81
|
+
const delay = Math.min(UDS_INITIAL_DELAY_MS * UDS_BACKOFF_FACTOR ** attempt, UDS_MAX_DELAY_MS);
|
|
82
|
+
console.warn(`Request to Render failed (attempt ${attempt + 1}/${UDS_MAX_RETRIES}), ` +
|
|
83
|
+
`retrying in ${delay}ms: ${lastError.message}`);
|
|
84
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
throw lastError;
|
|
89
|
+
}
|
|
90
|
+
async requestOnce(path, method, bodyString) {
|
|
63
91
|
return new Promise((resolve, reject) => {
|
|
64
92
|
const req = node_http_1.default.request({
|
|
65
93
|
socketPath: this.socketPath,
|
|
66
94
|
path: path,
|
|
67
95
|
method: method,
|
|
68
96
|
headers: {
|
|
69
|
-
"Content-Length":
|
|
97
|
+
"Content-Length": Buffer.byteLength(bodyString),
|
|
70
98
|
"Content-Type": "application/json",
|
|
71
99
|
"User-Agent": (0, version_js_1.getUserAgent)(),
|
|
72
100
|
},
|
|
@@ -93,7 +121,7 @@ class UDSClient {
|
|
|
93
121
|
req.on("error", (error) => {
|
|
94
122
|
reject(error);
|
|
95
123
|
});
|
|
96
|
-
req.end(
|
|
124
|
+
req.end(bodyString);
|
|
97
125
|
});
|
|
98
126
|
}
|
|
99
127
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { TaskRegistry } from "./registry.js";
|
|
2
|
+
import type { RegisterTaskOptions, Retry, TaskFunction } from "./types.js";
|
|
3
|
+
export interface WorkflowsOptions {
|
|
4
|
+
defaultRetry?: Retry;
|
|
5
|
+
defaultTimeout?: number;
|
|
6
|
+
defaultPlan?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class Workflows {
|
|
9
|
+
private readonly _registry;
|
|
10
|
+
private readonly _defaultRetry?;
|
|
11
|
+
private readonly _defaultTimeout?;
|
|
12
|
+
private readonly _defaultPlan?;
|
|
13
|
+
constructor(options?: WorkflowsOptions);
|
|
14
|
+
get registry(): TaskRegistry;
|
|
15
|
+
task<TArgs extends any[], TResult>(options: RegisterTaskOptions, func: TaskFunction<TArgs, TResult>): TaskFunction<TArgs, TResult>;
|
|
16
|
+
start(): Promise<void>;
|
|
17
|
+
static fromWorkflows(apps: Workflows[], options?: WorkflowsOptions): Workflows;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=workflows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../src/workflows/workflows.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE3E,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAWD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAS;gBAE3B,OAAO,CAAC,EAAE,gBAAgB;IAUtC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAQD,IAAI,CAAC,KAAK,SAAS,GAAG,EAAE,EAAE,OAAO,EAC/B,OAAO,EAAE,mBAAmB,EAC5B,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,GACjC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC;IAyBzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS;CAgB/E"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Workflows = void 0;
|
|
4
|
+
const errors_js_1 = require("../errors.js");
|
|
5
|
+
const registry_js_1 = require("./registry.js");
|
|
6
|
+
const runner_js_1 = require("./runner.js");
|
|
7
|
+
const task_js_1 = require("./task.js");
|
|
8
|
+
class Workflows {
|
|
9
|
+
constructor(options) {
|
|
10
|
+
this._registry = new registry_js_1.TaskRegistry();
|
|
11
|
+
this._defaultRetry = options?.defaultRetry;
|
|
12
|
+
this._defaultTimeout = options?.defaultTimeout;
|
|
13
|
+
this._defaultPlan = options?.defaultPlan;
|
|
14
|
+
}
|
|
15
|
+
get registry() {
|
|
16
|
+
return this._registry;
|
|
17
|
+
}
|
|
18
|
+
task(options, func) {
|
|
19
|
+
const mergedOptions = {
|
|
20
|
+
...options,
|
|
21
|
+
retry: options.retry ?? this._defaultRetry,
|
|
22
|
+
timeoutSeconds: options.timeoutSeconds ?? this._defaultTimeout,
|
|
23
|
+
plan: options.plan ?? this._defaultPlan,
|
|
24
|
+
};
|
|
25
|
+
this._registry.register(func, mergedOptions);
|
|
26
|
+
return ((...args) => {
|
|
27
|
+
const context = (0, task_js_1.getCurrentContext)();
|
|
28
|
+
if (!context) {
|
|
29
|
+
return func(...args);
|
|
30
|
+
}
|
|
31
|
+
const result = context.executeTask(func, options.name, ...args);
|
|
32
|
+
return result.get();
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
async start() {
|
|
36
|
+
await (0, runner_js_1.startTaskServer)(this._registry);
|
|
37
|
+
}
|
|
38
|
+
static fromWorkflows(apps, options) {
|
|
39
|
+
const combined = new Workflows(options);
|
|
40
|
+
for (const app of apps) {
|
|
41
|
+
for (const task of app._registry.getAllTasks()) {
|
|
42
|
+
if (combined._registry.has(task.name)) {
|
|
43
|
+
throw new errors_js_1.RenderError(`Duplicate task name '${task.name}' when combining workflows`);
|
|
44
|
+
}
|
|
45
|
+
combined._registry.registerMetadata(task);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return combined;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.Workflows = Workflows;
|
package/package.json
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@renderinc/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Render SDK for TypeScript",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
7
10
|
"scripts": {
|
|
8
11
|
"build": "tsc -p tsconfig.build.json",
|
|
9
12
|
"test": "vitest",
|
|
13
|
+
"test:e2e": "vitest run --config vitest.config.e2e.ts",
|
|
10
14
|
"typecheck": "tsc --noEmit",
|
|
11
15
|
"lint": "biome lint",
|
|
12
16
|
"lint:fix": "biome lint --write",
|
package/CHANGELOG.md
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to the `@renderinc/sdk` TypeScript SDK will be documented in this file.
|
|
4
|
-
|
|
5
|
-
This project follows [Semantic Versioning](https://semver.org/).
|
|
6
|
-
|
|
7
|
-
## [0.2.1] - 2026-01-29
|
|
8
|
-
|
|
9
|
-
### Changed
|
|
10
|
-
- Updated package name in README from @render/sdk to @renderinc/sdk
|
|
11
|
-
- Renamed experimental blob storage API to object storage (Blob* -> Object*)
|
|
12
|
-
- Switched internal workflows task communication from SSE to HTTP requests
|
|
13
|
-
|
|
14
|
-
## [0.2.0] - 2026-01-26
|
|
15
|
-
|
|
16
|
-
### Added
|
|
17
|
-
- Add experimental blob storage API with `BlobClient` and `ScopedBlobClient`
|
|
18
|
-
- Add plan support for task execution
|
|
19
|
-
- Add per-task timeout override via `timeoutSeconds` option
|
|
20
|
-
|
|
21
|
-
### Changed
|
|
22
|
-
- Auto-start task server on task registration (no need to call `startTaskServer()` manually)
|
|
23
|
-
- Rename `wait_duration` to `wait_duration_ms` for cross-SDK consistency
|
|
24
|
-
- Move generated API schema to `generated/` directory
|
|
25
|
-
|
|
26
|
-
## [0.1.0] - 2025-12-15
|
|
27
|
-
|
|
28
|
-
### Added
|
|
29
|
-
- Add initial TypeScript SDK for Render Workflows
|
|
30
|
-
- Add task registration and execution via `@renderinc/sdk/workflows`
|
|
31
|
-
- Add `TaskContext` for task metadata and subtask execution
|
|
32
|
-
- Add configurable retry policies with exponential backoff
|
|
33
|
-
- Add generated OpenAPI types for full type safety
|