@renderinc/sdk 0.1.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 +580 -0
- package/dist/errors.d.ts +25 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +56 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/render.d.ts +8 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +19 -0
- package/dist/utils/create-api-client.d.ts +4 -0
- package/dist/utils/create-api-client.d.ts.map +1 -0
- package/dist/utils/create-api-client.js +15 -0
- package/dist/utils/get-base-url.d.ts +8 -0
- package/dist/utils/get-base-url.d.ts.map +1 -0
- package/dist/utils/get-base-url.js +14 -0
- package/dist/utils/schema.d.ts +9322 -0
- package/dist/utils/schema.d.ts.map +1 -0
- package/dist/utils/schema.js +2 -0
- package/dist/workflows/client/client.d.ts +14 -0
- package/dist/workflows/client/client.d.ts.map +1 -0
- package/dist/workflows/client/client.js +88 -0
- package/dist/workflows/client/create-client.d.ts +4 -0
- package/dist/workflows/client/create-client.d.ts.map +1 -0
- package/dist/workflows/client/create-client.js +16 -0
- package/dist/workflows/client/errors.d.ts +25 -0
- package/dist/workflows/client/errors.d.ts.map +1 -0
- package/dist/workflows/client/errors.js +56 -0
- package/dist/workflows/client/index.d.ts +4 -0
- package/dist/workflows/client/index.d.ts.map +1 -0
- package/dist/workflows/client/index.js +22 -0
- package/dist/workflows/client/schema.d.ts +9322 -0
- package/dist/workflows/client/schema.d.ts.map +1 -0
- package/dist/workflows/client/schema.js +2 -0
- package/dist/workflows/client/sse.d.ts +14 -0
- package/dist/workflows/client/sse.d.ts.map +1 -0
- package/dist/workflows/client/sse.js +78 -0
- package/dist/workflows/client/types.d.ts +23 -0
- package/dist/workflows/client/types.d.ts.map +1 -0
- package/dist/workflows/client/types.js +10 -0
- package/dist/workflows/client/workflows.d.ts +15 -0
- package/dist/workflows/client/workflows.d.ts.map +1 -0
- package/dist/workflows/client/workflows.js +63 -0
- package/dist/workflows/executor.d.ts +8 -0
- package/dist/workflows/executor.d.ts.map +1 -0
- package/dist/workflows/executor.js +83 -0
- package/dist/workflows/index.d.ts +7 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +30 -0
- package/dist/workflows/registry.d.ts +14 -0
- package/dist/workflows/registry.d.ts.map +1 -0
- package/dist/workflows/registry.js +51 -0
- package/dist/workflows/runner.d.ts +3 -0
- package/dist/workflows/runner.d.ts.map +1 -0
- package/dist/workflows/runner.js +27 -0
- package/dist/workflows/schema.d.ts +296 -0
- package/dist/workflows/schema.d.ts.map +1 -0
- package/dist/workflows/schema.js +2 -0
- package/dist/workflows/task.d.ts +5 -0
- package/dist/workflows/task.d.ts.map +1 -0
- package/dist/workflows/task.js +26 -0
- package/dist/workflows/types.d.ts +35 -0
- package/dist/workflows/types.d.ts.map +1 -0
- package/dist/workflows/types.js +2 -0
- package/dist/workflows/uds.d.ts +13 -0
- package/dist/workflows/uds.d.ts.map +1 -0
- package/dist/workflows/uds.js +155 -0
- package/package.json +65 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { TaskRunDetails } from "./types.js";
|
|
2
|
+
export declare enum TaskEventType {
|
|
3
|
+
COMPLETED = "task.completed",
|
|
4
|
+
FAILED = "task.failed",
|
|
5
|
+
RUNNING = "task.running",
|
|
6
|
+
PENDING = "task.pending"
|
|
7
|
+
}
|
|
8
|
+
export declare class SSEClient {
|
|
9
|
+
private baseUrl;
|
|
10
|
+
private token;
|
|
11
|
+
constructor(baseUrl: string, token: string);
|
|
12
|
+
waitOnTaskRun(taskRunId: string, signal?: AbortSignal): Promise<TaskRunDetails>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=sse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../../src/workflows/client/sse.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD,oBAAY,aAAa;IACvB,SAAS,mBAAmB;IAC5B,MAAM,gBAAgB;IACtB,OAAO,iBAAiB;IACxB,OAAO,iBAAiB;CACzB;AAKD,qBAAa,SAAS;IAElB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,KAAK;gBADL,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM;IAGjB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;CAqEtF"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SSEClient = exports.TaskEventType = void 0;
|
|
4
|
+
const eventsource_1 = require("eventsource");
|
|
5
|
+
const errors_js_1 = require("../../errors.js");
|
|
6
|
+
var TaskEventType;
|
|
7
|
+
(function (TaskEventType) {
|
|
8
|
+
TaskEventType["COMPLETED"] = "task.completed";
|
|
9
|
+
TaskEventType["FAILED"] = "task.failed";
|
|
10
|
+
TaskEventType["RUNNING"] = "task.running";
|
|
11
|
+
TaskEventType["PENDING"] = "task.pending";
|
|
12
|
+
})(TaskEventType || (exports.TaskEventType = TaskEventType = {}));
|
|
13
|
+
class SSEClient {
|
|
14
|
+
constructor(baseUrl, token) {
|
|
15
|
+
this.baseUrl = baseUrl;
|
|
16
|
+
this.token = token;
|
|
17
|
+
}
|
|
18
|
+
async waitOnTaskRun(taskRunId, signal) {
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
let eventSource = null;
|
|
21
|
+
const abortHandler = () => {
|
|
22
|
+
cleanup();
|
|
23
|
+
reject(new errors_js_1.AbortError());
|
|
24
|
+
};
|
|
25
|
+
const cleanup = () => {
|
|
26
|
+
if (eventSource) {
|
|
27
|
+
eventSource.removeEventListener(TaskEventType.COMPLETED, eventHandler);
|
|
28
|
+
eventSource.removeEventListener(TaskEventType.FAILED, eventHandler);
|
|
29
|
+
eventSource.removeEventListener("error", errorHandler);
|
|
30
|
+
eventSource.close();
|
|
31
|
+
eventSource = null;
|
|
32
|
+
}
|
|
33
|
+
signal?.removeEventListener("abort", abortHandler);
|
|
34
|
+
};
|
|
35
|
+
const eventHandler = (event) => {
|
|
36
|
+
try {
|
|
37
|
+
const details = JSON.parse(event.data);
|
|
38
|
+
cleanup();
|
|
39
|
+
resolve(details);
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
cleanup();
|
|
43
|
+
reject(new Error(`Failed to parse task run details: ${e}`));
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
const errorHandler = (error) => {
|
|
47
|
+
cleanup();
|
|
48
|
+
reject(new Error(`SSE connection error: ${error.message || "Unknown error"}`));
|
|
49
|
+
};
|
|
50
|
+
if (signal?.aborted) {
|
|
51
|
+
reject(new errors_js_1.AbortError());
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
signal?.addEventListener("abort", abortHandler);
|
|
55
|
+
try {
|
|
56
|
+
const url = new URL("/v1/task-runs/events", this.baseUrl);
|
|
57
|
+
url.searchParams.append("taskRunIds", taskRunId);
|
|
58
|
+
eventSource = new eventsource_1.EventSource(url.toString(), {
|
|
59
|
+
fetch: (input, init) => fetch(input, {
|
|
60
|
+
...init,
|
|
61
|
+
headers: {
|
|
62
|
+
...init?.headers,
|
|
63
|
+
Authorization: `Bearer ${this.token}`,
|
|
64
|
+
},
|
|
65
|
+
}),
|
|
66
|
+
});
|
|
67
|
+
eventSource.addEventListener(TaskEventType.COMPLETED, eventHandler);
|
|
68
|
+
eventSource.addEventListener(TaskEventType.FAILED, eventHandler);
|
|
69
|
+
eventSource.addEventListener("error", errorHandler);
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
cleanup();
|
|
73
|
+
reject(e);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.SSEClient = SSEClient;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { components, paths } from "../../utils/schema";
|
|
2
|
+
export type TaskIdentifier = string;
|
|
3
|
+
export type TaskData = Array<any>;
|
|
4
|
+
export declare enum TaskRunStatus {
|
|
5
|
+
PENDING = "pending",
|
|
6
|
+
RUNNING = "running",
|
|
7
|
+
COMPLETED = "completed",
|
|
8
|
+
FAILED = "failed"
|
|
9
|
+
}
|
|
10
|
+
export type TaskRun = components["schemas"]["TaskRun"];
|
|
11
|
+
export type TaskRunDetails = components["schemas"]["TaskRunDetails"];
|
|
12
|
+
export type ListTaskRunsParams = paths["/task-runs"]["get"]["parameters"]["query"];
|
|
13
|
+
export interface RunTaskRequest {
|
|
14
|
+
task: TaskIdentifier;
|
|
15
|
+
input: TaskData;
|
|
16
|
+
}
|
|
17
|
+
export interface ClientOptions {
|
|
18
|
+
token?: string;
|
|
19
|
+
baseUrl?: string;
|
|
20
|
+
useLocalDev?: boolean;
|
|
21
|
+
localDevUrl?: string;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +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,oBAAoB,CAAC;AAK5D,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;CACtB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TaskRunStatus = void 0;
|
|
4
|
+
var TaskRunStatus;
|
|
5
|
+
(function (TaskRunStatus) {
|
|
6
|
+
TaskRunStatus["PENDING"] = "pending";
|
|
7
|
+
TaskRunStatus["RUNNING"] = "running";
|
|
8
|
+
TaskRunStatus["COMPLETED"] = "completed";
|
|
9
|
+
TaskRunStatus["FAILED"] = "failed";
|
|
10
|
+
})(TaskRunStatus || (exports.TaskRunStatus = TaskRunStatus = {}));
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Client } from 'openapi-fetch';
|
|
2
|
+
import type { paths } from './schema.js';
|
|
3
|
+
import type { SSEClient } from './sse.js';
|
|
4
|
+
import type { ListTaskRunsParams, TaskData, TaskIdentifier, TaskRun, TaskRunDetails } from './types.js';
|
|
5
|
+
export declare class WorkflowsService {
|
|
6
|
+
private sseClient;
|
|
7
|
+
private apiClient;
|
|
8
|
+
constructor(sseClient: SSEClient, apiClient: Client<paths>);
|
|
9
|
+
runTask(taskIdentifier: TaskIdentifier, inputData: TaskData): Promise<TaskRun>;
|
|
10
|
+
waitForTask(taskRunId: string): Promise<TaskRunDetails>;
|
|
11
|
+
getTaskRun(taskRunId: string): Promise<TaskRunDetails>;
|
|
12
|
+
cancelTaskRun(taskRunId: string): Promise<void>;
|
|
13
|
+
listTaskRuns(params: ListTaskRunsParams): Promise<TaskRun[]>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=workflows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../../src/workflows/client/workflows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EACV,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,OAAO,EACP,cAAc,EACf,MAAM,YAAY,CAAC;AAoBpB,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,SAAS;gBADT,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC;IAS5B,OAAO,CAAC,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAe9E,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAUvD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAetD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe/C,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CASnE"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkflowsService = void 0;
|
|
4
|
+
const errors_js_1 = require("./errors.js");
|
|
5
|
+
function handleApiError(error, response, context) {
|
|
6
|
+
const statusCode = response.status;
|
|
7
|
+
const errorMessage = `${context}: ${error}`;
|
|
8
|
+
if (statusCode >= 500) {
|
|
9
|
+
throw new errors_js_1.ServerError(errorMessage, statusCode, error);
|
|
10
|
+
}
|
|
11
|
+
else if (statusCode >= 400) {
|
|
12
|
+
throw new errors_js_1.ClientError(errorMessage, statusCode, error);
|
|
13
|
+
}
|
|
14
|
+
throw new errors_js_1.ClientError(errorMessage, statusCode, error);
|
|
15
|
+
}
|
|
16
|
+
class WorkflowsService {
|
|
17
|
+
constructor(sseClient, apiClient) {
|
|
18
|
+
this.sseClient = sseClient;
|
|
19
|
+
this.apiClient = apiClient;
|
|
20
|
+
}
|
|
21
|
+
async runTask(taskIdentifier, inputData) {
|
|
22
|
+
const { data, error, response } = await this.apiClient.POST('/task-runs', {
|
|
23
|
+
body: {
|
|
24
|
+
task: taskIdentifier,
|
|
25
|
+
input: inputData,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
if (error) {
|
|
29
|
+
handleApiError(error, response, 'Failed to run task');
|
|
30
|
+
}
|
|
31
|
+
return data;
|
|
32
|
+
}
|
|
33
|
+
async waitForTask(taskRunId) {
|
|
34
|
+
return this.sseClient.waitOnTaskRun(taskRunId);
|
|
35
|
+
}
|
|
36
|
+
async getTaskRun(taskRunId) {
|
|
37
|
+
const { data, error, response } = await this.apiClient.GET('/task-runs/{taskRunId}', {
|
|
38
|
+
params: { path: { taskRunId } },
|
|
39
|
+
});
|
|
40
|
+
if (error) {
|
|
41
|
+
handleApiError(error, response, 'Failed to get task run');
|
|
42
|
+
}
|
|
43
|
+
return data;
|
|
44
|
+
}
|
|
45
|
+
async cancelTaskRun(taskRunId) {
|
|
46
|
+
const { error, response } = await this.apiClient.DELETE('/task-runs/{taskRunId}', {
|
|
47
|
+
params: { path: { taskRunId } },
|
|
48
|
+
});
|
|
49
|
+
if (error) {
|
|
50
|
+
handleApiError(error, response, 'Failed to cancel task run');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async listTaskRuns(params) {
|
|
54
|
+
const { data, error, response } = await this.apiClient.GET('/task-runs', {
|
|
55
|
+
params: { query: params },
|
|
56
|
+
});
|
|
57
|
+
if (error) {
|
|
58
|
+
handleApiError(error, response, 'Failed to list task runs');
|
|
59
|
+
}
|
|
60
|
+
return data;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.WorkflowsService = WorkflowsService;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/workflows/executor.ts"],"names":[],"mappings":"AAyEA,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,OAAO,CAAc;gBAEjB,UAAU,EAAE,MAAM;IAQxB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC5B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAKrC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TaskExecutor = void 0;
|
|
4
|
+
const errors_js_1 = require("../errors.js");
|
|
5
|
+
const registry_js_1 = require("./registry.js");
|
|
6
|
+
const task_js_1 = require("./task.js");
|
|
7
|
+
const uds_js_1 = require("./uds.js");
|
|
8
|
+
class TaskResultImpl {
|
|
9
|
+
constructor(subtaskId, udsClient) {
|
|
10
|
+
this.subtaskId = subtaskId;
|
|
11
|
+
this.udsClient = udsClient;
|
|
12
|
+
}
|
|
13
|
+
async get() {
|
|
14
|
+
const pollInterval = 500;
|
|
15
|
+
while (true) {
|
|
16
|
+
const result = await this.udsClient.getSubtaskResult(this.subtaskId);
|
|
17
|
+
if (!result.still_running && result.complete) {
|
|
18
|
+
if (result.complete.output) {
|
|
19
|
+
const json = Buffer.from(result.complete.output, "base64").toString();
|
|
20
|
+
const decoded = JSON.parse(json);
|
|
21
|
+
return decoded[0];
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
else if (!result.still_running && result.error) {
|
|
26
|
+
throw new errors_js_1.RenderError(`Subtask failed: ${result.error}`);
|
|
27
|
+
}
|
|
28
|
+
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
class TaskContextImpl {
|
|
33
|
+
constructor(udsClient) {
|
|
34
|
+
this.udsClient = udsClient;
|
|
35
|
+
}
|
|
36
|
+
executeTask(_task, taskName, ...args) {
|
|
37
|
+
const registry = registry_js_1.TaskRegistry.getInstance();
|
|
38
|
+
if (!registry.has(taskName)) {
|
|
39
|
+
throw new errors_js_1.RenderError(`Task '${taskName}' is not registered`);
|
|
40
|
+
}
|
|
41
|
+
const subtaskIdPromise = this.udsClient.runSubtask(taskName, args);
|
|
42
|
+
return {
|
|
43
|
+
get: async () => {
|
|
44
|
+
const subtaskId = await subtaskIdPromise;
|
|
45
|
+
const result = new TaskResultImpl(subtaskId, this.udsClient);
|
|
46
|
+
return result.get();
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
class TaskExecutor {
|
|
52
|
+
constructor(socketPath) {
|
|
53
|
+
this.udsClient = new uds_js_1.UDSClient(socketPath);
|
|
54
|
+
this.context = new TaskContextImpl(this.udsClient);
|
|
55
|
+
}
|
|
56
|
+
async executeTask() {
|
|
57
|
+
const registry = registry_js_1.TaskRegistry.getInstance();
|
|
58
|
+
try {
|
|
59
|
+
const input = await this.udsClient.getInput();
|
|
60
|
+
const taskName = input.task_name;
|
|
61
|
+
const inputData = JSON.parse(Buffer.from(input.input, "base64").toString());
|
|
62
|
+
const taskMetadata = registry.get(taskName);
|
|
63
|
+
if (!taskMetadata) {
|
|
64
|
+
throw new errors_js_1.RenderError(`Task '${taskName}' not found in registry`);
|
|
65
|
+
}
|
|
66
|
+
const result = await (0, task_js_1.setCurrentContext)(this.context, async () => {
|
|
67
|
+
return await taskMetadata.func(...inputData);
|
|
68
|
+
});
|
|
69
|
+
await this.udsClient.sendCallback(result);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
73
|
+
await this.udsClient.sendCallback(undefined, errorMessage);
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async registerTasks() {
|
|
78
|
+
const registry = registry_js_1.TaskRegistry.getInstance();
|
|
79
|
+
const tasks = registry.getAllTasks();
|
|
80
|
+
await this.udsClient.registerTasks(tasks);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.TaskExecutor = TaskExecutor;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./client/index.js";
|
|
2
|
+
export { TaskExecutor } from "./executor.js";
|
|
3
|
+
export { TaskRegistry } from "./registry.js";
|
|
4
|
+
export { run, startTaskServer } from "./runner.js";
|
|
5
|
+
export { getCurrentContext, setCurrentContext, task } from "./task.js";
|
|
6
|
+
export * from "./types.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AACA,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACvE,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.task = exports.setCurrentContext = exports.getCurrentContext = exports.startTaskServer = exports.run = exports.TaskRegistry = exports.TaskExecutor = void 0;
|
|
18
|
+
__exportStar(require("./client/index.js"), exports);
|
|
19
|
+
var executor_js_1 = require("./executor.js");
|
|
20
|
+
Object.defineProperty(exports, "TaskExecutor", { enumerable: true, get: function () { return executor_js_1.TaskExecutor; } });
|
|
21
|
+
var registry_js_1 = require("./registry.js");
|
|
22
|
+
Object.defineProperty(exports, "TaskRegistry", { enumerable: true, get: function () { return registry_js_1.TaskRegistry; } });
|
|
23
|
+
var runner_js_1 = require("./runner.js");
|
|
24
|
+
Object.defineProperty(exports, "run", { enumerable: true, get: function () { return runner_js_1.run; } });
|
|
25
|
+
Object.defineProperty(exports, "startTaskServer", { enumerable: true, get: function () { return runner_js_1.startTaskServer; } });
|
|
26
|
+
var task_js_1 = require("./task.js");
|
|
27
|
+
Object.defineProperty(exports, "getCurrentContext", { enumerable: true, get: function () { return task_js_1.getCurrentContext; } });
|
|
28
|
+
Object.defineProperty(exports, "setCurrentContext", { enumerable: true, get: function () { return task_js_1.setCurrentContext; } });
|
|
29
|
+
Object.defineProperty(exports, "task", { enumerable: true, get: function () { return task_js_1.task; } });
|
|
30
|
+
__exportStar(require("./types.js"), exports);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { RegisterTaskOptions, TaskFunction, TaskMetadata } from "./types.js";
|
|
2
|
+
export declare class TaskRegistry {
|
|
3
|
+
private static instance;
|
|
4
|
+
private tasks;
|
|
5
|
+
private constructor();
|
|
6
|
+
static getInstance(): TaskRegistry;
|
|
7
|
+
register(func: TaskFunction, options: RegisterTaskOptions): void;
|
|
8
|
+
get(name: string): TaskMetadata | undefined;
|
|
9
|
+
getAllTaskNames(): string[];
|
|
10
|
+
getAllTasks(): TaskMetadata[];
|
|
11
|
+
has(name: string): boolean;
|
|
12
|
+
clear(): void;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/workflows/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAe,MAAM,YAAY,CAAC;AAK/F,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAe;IACtC,OAAO,CAAC,KAAK,CAAwC;IAErD,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,YAAY;IAUlC,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI;IA4BhE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAO3C,eAAe,IAAI,MAAM,EAAE;IAI3B,WAAW,IAAI,YAAY,EAAE;IAO7B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAO1B,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TaskRegistry = void 0;
|
|
4
|
+
class TaskRegistry {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.tasks = new Map();
|
|
7
|
+
}
|
|
8
|
+
static getInstance() {
|
|
9
|
+
if (!TaskRegistry.instance) {
|
|
10
|
+
TaskRegistry.instance = new TaskRegistry();
|
|
11
|
+
}
|
|
12
|
+
return TaskRegistry.instance;
|
|
13
|
+
}
|
|
14
|
+
register(func, options) {
|
|
15
|
+
const taskName = options.name;
|
|
16
|
+
if (!taskName) {
|
|
17
|
+
throw new Error("Task function must have a name or name must be provided");
|
|
18
|
+
}
|
|
19
|
+
let taskOptions;
|
|
20
|
+
if (options.retry) {
|
|
21
|
+
taskOptions = {
|
|
22
|
+
retry: {
|
|
23
|
+
max_retries: options.retry.maxRetries,
|
|
24
|
+
wait_duration_ms: options.retry.waitDuration,
|
|
25
|
+
factor: options.retry.backoffScaling,
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
this.tasks.set(taskName, {
|
|
30
|
+
name: taskName,
|
|
31
|
+
func,
|
|
32
|
+
options: taskOptions,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
get(name) {
|
|
36
|
+
return this.tasks.get(name);
|
|
37
|
+
}
|
|
38
|
+
getAllTaskNames() {
|
|
39
|
+
return Array.from(this.tasks.keys());
|
|
40
|
+
}
|
|
41
|
+
getAllTasks() {
|
|
42
|
+
return Array.from(this.tasks.values());
|
|
43
|
+
}
|
|
44
|
+
has(name) {
|
|
45
|
+
return this.tasks.has(name);
|
|
46
|
+
}
|
|
47
|
+
clear() {
|
|
48
|
+
this.tasks.clear();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.TaskRegistry = TaskRegistry;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/workflows/runner.ts"],"names":[],"mappings":"AAMA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAmBrD;AAKD,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3D"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.startTaskServer = startTaskServer;
|
|
4
|
+
exports.run = run;
|
|
5
|
+
const errors_js_1 = require("../errors.js");
|
|
6
|
+
const executor_js_1 = require("./executor.js");
|
|
7
|
+
async function startTaskServer() {
|
|
8
|
+
const mode = process.env.RENDER_SDK_MODE || "run";
|
|
9
|
+
const socketPath = process.env.RENDER_SDK_SOCKET_PATH;
|
|
10
|
+
if (!socketPath) {
|
|
11
|
+
throw new errors_js_1.RenderError("RENDER_SDK_SOCKET_PATH environment variable is required");
|
|
12
|
+
}
|
|
13
|
+
const executor = new executor_js_1.TaskExecutor(socketPath);
|
|
14
|
+
if (mode === "register") {
|
|
15
|
+
await executor.registerTasks();
|
|
16
|
+
}
|
|
17
|
+
else if (mode === "run") {
|
|
18
|
+
await executor.executeTask();
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
throw new errors_js_1.RenderError(`Unknown SDK mode: ${mode}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async function run(socketPath) {
|
|
25
|
+
const executor = new executor_js_1.TaskExecutor(socketPath);
|
|
26
|
+
await executor.executeTask();
|
|
27
|
+
}
|