@renderinc/sdk 0.1.0 → 0.2.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.
Files changed (126) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +17 -7
  3. package/biome.json +84 -0
  4. package/dist/experimental/blob/api.d.ts +11 -0
  5. package/dist/experimental/blob/api.d.ts.map +1 -0
  6. package/dist/experimental/blob/api.js +44 -0
  7. package/dist/experimental/blob/client.d.ts +21 -0
  8. package/dist/experimental/blob/client.d.ts.map +1 -0
  9. package/dist/experimental/blob/client.js +127 -0
  10. package/dist/experimental/blob/index.d.ts +5 -0
  11. package/dist/experimental/blob/index.d.ts.map +1 -0
  12. package/dist/experimental/blob/index.js +8 -0
  13. package/dist/experimental/blob/types.d.ts +49 -0
  14. package/dist/experimental/blob/types.d.ts.map +1 -0
  15. package/dist/experimental/experimental.d.ts +12 -0
  16. package/dist/experimental/experimental.d.ts.map +1 -0
  17. package/dist/experimental/experimental.js +16 -0
  18. package/dist/experimental/index.d.ts +3 -0
  19. package/dist/experimental/index.d.ts.map +1 -0
  20. package/dist/experimental/index.js +10 -0
  21. package/dist/experimental/object/api.d.ts +11 -0
  22. package/dist/experimental/object/api.d.ts.map +1 -0
  23. package/dist/experimental/object/api.js +44 -0
  24. package/dist/experimental/object/client.d.ts +21 -0
  25. package/dist/experimental/object/client.d.ts.map +1 -0
  26. package/dist/experimental/object/client.js +127 -0
  27. package/dist/experimental/object/index.d.ts +5 -0
  28. package/dist/experimental/object/index.d.ts.map +1 -0
  29. package/dist/experimental/object/index.js +8 -0
  30. package/dist/experimental/object/types.d.ts +49 -0
  31. package/dist/experimental/object/types.d.ts.map +1 -0
  32. package/dist/experimental/object/types.js +2 -0
  33. package/dist/generated/schema.d.ts +9910 -0
  34. package/dist/generated/schema.d.ts.map +1 -0
  35. package/dist/generated/schema.js +2 -0
  36. package/dist/index.d.ts +3 -1
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +5 -2
  39. package/dist/render.d.ts +2 -0
  40. package/dist/render.d.ts.map +1 -1
  41. package/dist/render.js +4 -2
  42. package/dist/utils/create-api-client.d.ts +1 -1
  43. package/dist/utils/create-api-client.d.ts.map +1 -1
  44. package/dist/utils/create-api-client.js +2 -0
  45. package/dist/version.d.ts +3 -0
  46. package/dist/version.d.ts.map +1 -0
  47. package/dist/version.js +23 -0
  48. package/dist/workflows/client/client.d.ts +1 -1
  49. package/dist/workflows/client/client.d.ts.map +1 -1
  50. package/dist/workflows/client/sse.d.ts +2 -2
  51. package/dist/workflows/client/sse.d.ts.map +1 -1
  52. package/dist/workflows/client/sse.js +2 -0
  53. package/dist/workflows/client/types.d.ts +1 -1
  54. package/dist/workflows/client/types.d.ts.map +1 -1
  55. package/dist/workflows/executor.d.ts +2 -2
  56. package/dist/workflows/executor.d.ts.map +1 -1
  57. package/dist/workflows/registry.d.ts +1 -1
  58. package/dist/workflows/registry.d.ts.map +1 -1
  59. package/dist/workflows/registry.js +13 -6
  60. package/dist/workflows/runner.d.ts.map +1 -1
  61. package/dist/workflows/runner.js +2 -0
  62. package/dist/workflows/schema.d.ts +9 -0
  63. package/dist/workflows/schema.d.ts.map +1 -1
  64. package/dist/workflows/task.d.ts +1 -0
  65. package/dist/workflows/task.d.ts.map +1 -1
  66. package/dist/workflows/task.js +34 -0
  67. package/dist/workflows/types.d.ts +3 -1
  68. package/dist/workflows/types.d.ts.map +1 -1
  69. package/dist/workflows/uds.d.ts +1 -1
  70. package/dist/workflows/uds.d.ts.map +1 -1
  71. package/dist/workflows/uds.js +27 -82
  72. package/examples/client/main.ts +42 -0
  73. package/examples/client/package-lock.json +601 -0
  74. package/examples/client/package.json +16 -0
  75. package/examples/client/tsconfig.json +17 -0
  76. package/examples/task/main.ts +90 -0
  77. package/examples/task/package-lock.json +584 -0
  78. package/examples/task/package.json +16 -0
  79. package/examples/task/tsconfig.json +17 -0
  80. package/package.json +19 -27
  81. package/src/errors.test.ts +75 -0
  82. package/src/errors.ts +73 -0
  83. package/src/experimental/experimental.ts +56 -0
  84. package/src/experimental/index.ts +24 -0
  85. package/src/experimental/object/api.ts +91 -0
  86. package/src/experimental/object/client.test.ts +138 -0
  87. package/src/experimental/object/client.ts +317 -0
  88. package/src/experimental/object/index.ts +22 -0
  89. package/src/experimental/object/types.test.ts +87 -0
  90. package/src/experimental/object/types.ts +131 -0
  91. package/src/generated/schema.ts +12937 -0
  92. package/src/index.ts +7 -0
  93. package/src/render.ts +35 -0
  94. package/src/utils/create-api-client.ts +13 -0
  95. package/src/utils/get-base-url.test.ts +58 -0
  96. package/src/utils/get-base-url.ts +16 -0
  97. package/src/version.ts +37 -0
  98. package/src/workflows/client/client.test.ts +68 -0
  99. package/src/workflows/client/client.ts +142 -0
  100. package/src/workflows/client/create-client.ts +17 -0
  101. package/src/workflows/client/index.ts +3 -0
  102. package/src/workflows/client/sse.ts +95 -0
  103. package/src/workflows/client/types.ts +56 -0
  104. package/src/workflows/executor.ts +124 -0
  105. package/src/workflows/index.ts +7 -0
  106. package/src/workflows/registry.test.ts +76 -0
  107. package/src/workflows/registry.ts +88 -0
  108. package/src/workflows/runner.ts +38 -0
  109. package/src/workflows/schema.ts +348 -0
  110. package/src/workflows/task.ts +117 -0
  111. package/src/workflows/types.test.ts +52 -0
  112. package/src/workflows/types.ts +89 -0
  113. package/src/workflows/uds.ts +139 -0
  114. package/test-types.ts +14 -0
  115. package/tsconfig.build.json +4 -0
  116. package/tsconfig.json +23 -0
  117. package/vitest.config.ts +8 -0
  118. package/dist/workflows/client/errors.d.ts +0 -25
  119. package/dist/workflows/client/errors.d.ts.map +0 -1
  120. package/dist/workflows/client/errors.js +0 -56
  121. package/dist/workflows/client/schema.d.ts +0 -9322
  122. package/dist/workflows/client/schema.d.ts.map +0 -1
  123. package/dist/workflows/client/workflows.d.ts +0 -15
  124. package/dist/workflows/client/workflows.d.ts.map +0 -1
  125. package/dist/workflows/client/workflows.js +0 -63
  126. /package/dist/{workflows/client/schema.js → experimental/blob/types.js} +0 -0
@@ -0,0 +1,52 @@
1
+ import type { TaskContext, TaskFunction, TaskResult } from "./types.js";
2
+
3
+ describe("TaskFunction type", () => {
4
+ it("accepts typed args and returns typed result", () => {
5
+ expectTypeOf<TaskFunction<[string, number], boolean>>().toExtend<
6
+ (a: string, b: number) => boolean | Promise<boolean>
7
+ >();
8
+ });
9
+
10
+ it("defaults to any[] args and any result", () => {
11
+ expectTypeOf<TaskFunction>().toExtend<(...args: any[]) => any>();
12
+ });
13
+
14
+ it("allows async return type", () => {
15
+ const asyncFn: TaskFunction<[string], number> = async (s) => s.length;
16
+ expectTypeOf(asyncFn).returns.toExtend<number | Promise<number>>();
17
+ });
18
+
19
+ it("allows sync return type", () => {
20
+ const syncFn: TaskFunction<[string], number> = (s) => s.length;
21
+ expectTypeOf(syncFn).returns.toExtend<number | Promise<number>>();
22
+ });
23
+ });
24
+
25
+ describe("TaskResult type", () => {
26
+ it("get() returns Promise<T>", () => {
27
+ expectTypeOf<TaskResult<string>>().toHaveProperty("get");
28
+ expectTypeOf<TaskResult<string>["get"]>().returns.toEqualTypeOf<Promise<string>>();
29
+ });
30
+
31
+ it("preserves generic parameter", () => {
32
+ type NumberResult = TaskResult<number>;
33
+ type StringResult = TaskResult<string>;
34
+ expectTypeOf<NumberResult["get"]>().returns.toEqualTypeOf<Promise<number>>();
35
+ expectTypeOf<StringResult["get"]>().returns.toEqualTypeOf<Promise<string>>();
36
+ });
37
+ });
38
+
39
+ describe("TaskContext type", () => {
40
+ it("has executeTask method", () => {
41
+ expectTypeOf<TaskContext>().toHaveProperty("executeTask");
42
+ });
43
+
44
+ it("executeTask is callable", () => {
45
+ type ExecuteTask = TaskContext["executeTask"];
46
+ expectTypeOf<ExecuteTask>().toBeCallableWith(
47
+ {} as TaskFunction<[string], number>,
48
+ "taskName",
49
+ "arg",
50
+ );
51
+ });
52
+ });
@@ -0,0 +1,89 @@
1
+ import type { components } from "./schema.js";
2
+
3
+ /**
4
+ * Task function signature
5
+ */
6
+ export type TaskFunction<TArgs extends any[] = any[], TResult = any> = (
7
+ ...args: TArgs
8
+ ) => TResult | Promise<TResult>;
9
+
10
+ export type TaskOptions = components["schemas"]["TaskOptions"];
11
+
12
+ /**
13
+ * Task metadata
14
+ */
15
+ export interface TaskMetadata {
16
+ name: string;
17
+ func: TaskFunction;
18
+ options?: TaskOptions;
19
+ }
20
+
21
+ /**
22
+ * Task context for executing subtasks
23
+ */
24
+ export interface TaskContext {
25
+ executeTask<TArgs extends any[], TResult>(
26
+ task: TaskFunction<TArgs, TResult>,
27
+ taskName: string,
28
+ ...args: TArgs
29
+ ): TaskResult<TResult>;
30
+ }
31
+
32
+ /**
33
+ * Result of a task execution
34
+ */
35
+ export interface TaskResult<T> {
36
+ get(): Promise<T>;
37
+ }
38
+
39
+ /**
40
+ * Task input from the workflow system
41
+ */
42
+ export interface TaskInput {
43
+ task_name: string;
44
+ input: any[];
45
+ }
46
+
47
+ /**
48
+ * Task callback request/response types
49
+ */
50
+
51
+ export type CallbackRequest = components["schemas"]["CallbackRequest"];
52
+
53
+ export type GetInputResponse = components["schemas"]["InputResponse"];
54
+
55
+ export type RunSubtaskRequest = components["schemas"]["RunSubtaskRequest"];
56
+
57
+ export type RunSubtaskResponse = components["schemas"]["RunSubtaskResponse"];
58
+
59
+ export type GetSubtaskResultRequest = components["schemas"]["SubtaskResultRequest"];
60
+
61
+ export type GetSubtaskResultResponse = components["schemas"]["SubtaskResultResponse"];
62
+
63
+ export type RegisterTasksRequest = components["schemas"]["Tasks"];
64
+
65
+ /**
66
+ * Retry configuration for task execution
67
+ */
68
+ export interface Retry {
69
+ maxRetries: number;
70
+ waitDurationMs: number;
71
+ backoffScaling?: number; // default 1.5
72
+ }
73
+
74
+ /**
75
+ * Task execution options
76
+ */
77
+ export interface RegisterTaskOptions {
78
+ retry?: Retry;
79
+ timeoutSeconds?: number;
80
+ /**
81
+ * Resource plan for task execution.
82
+ * Common plans include:
83
+ * - "starter": 0.5 CPU, 512MB memory
84
+ * - "standard": 1 CPU, 2GB memory (default)
85
+ * - "pro": 2 CPU, 4GB memory
86
+ */
87
+ plan?: string;
88
+ name: string;
89
+ }
@@ -0,0 +1,139 @@
1
+ import http from "node:http";
2
+ import { getUserAgent } from "../version.js";
3
+
4
+ import type {
5
+ CallbackRequest,
6
+ GetInputResponse,
7
+ GetSubtaskResultRequest,
8
+ GetSubtaskResultResponse,
9
+ RegisterTasksRequest,
10
+ RunSubtaskRequest,
11
+ RunSubtaskResponse,
12
+ TaskMetadata,
13
+ } from "./types.js";
14
+
15
+ /**
16
+ * Unix Domain Socket client for communicating with the workflow system
17
+ */
18
+ export class UDSClient {
19
+ constructor(private readonly socketPath: string) {}
20
+
21
+ /**
22
+ * Get task input and name
23
+ */
24
+ async getInput(): Promise<GetInputResponse> {
25
+ return this.request<GetInputResponse>("/input", "GET");
26
+ }
27
+
28
+ private buildCallbackBody(results?: any, error?: string): CallbackRequest {
29
+ if (results !== undefined) {
30
+ const resultsArray = [results];
31
+ const output = Buffer.from(JSON.stringify(resultsArray)).toString("base64");
32
+ return {
33
+ complete: {
34
+ output,
35
+ },
36
+ };
37
+ }
38
+
39
+ if (error === undefined) {
40
+ throw new Error("Either results or error must be provided");
41
+ }
42
+
43
+ return {
44
+ error: {
45
+ details: error,
46
+ },
47
+ };
48
+ }
49
+
50
+ /**
51
+ * Send task result or error
52
+ */
53
+ async sendCallback(results?: any, error?: string): Promise<void> {
54
+ await this.request<void>("/callback", "POST", this.buildCallbackBody(results, error));
55
+ }
56
+
57
+ /**
58
+ * Run a subtask
59
+ */
60
+ async runSubtask(taskName: string, input: any[]): Promise<string> {
61
+ const inputBase64 = Buffer.from(JSON.stringify(input)).toString("base64");
62
+ const body: RunSubtaskRequest = {
63
+ task_name: taskName,
64
+ input: inputBase64,
65
+ };
66
+ const response = await this.request<RunSubtaskResponse>("/run-subtask", "POST", body);
67
+ return response.task_run_id;
68
+ }
69
+
70
+ /**
71
+ * Get subtask result
72
+ */
73
+ async getSubtaskResult(subtaskId: string): Promise<GetSubtaskResultResponse> {
74
+ const body: GetSubtaskResultRequest = {
75
+ task_run_id: subtaskId,
76
+ };
77
+ return this.request<GetSubtaskResultResponse>("/get-subtask-result", "POST", body);
78
+ }
79
+
80
+ /**
81
+ * Register tasks with the workflow system
82
+ */
83
+ async registerTasks(tasks: TaskMetadata[]): Promise<void> {
84
+ const body: RegisterTasksRequest = {
85
+ tasks: tasks.map((task) => ({
86
+ name: task.name,
87
+ options: task.options,
88
+ })),
89
+ };
90
+ await this.request<void>("/register-tasks", "POST", body);
91
+ }
92
+
93
+ /**
94
+ * Make a request to the Unix socket
95
+ */
96
+ private async request<T>(path: string, method: string, body?: any): Promise<T> {
97
+ return new Promise((resolve, reject) => {
98
+ const req = http.request(
99
+ {
100
+ socketPath: this.socketPath,
101
+ path: path,
102
+ method: method,
103
+ headers: {
104
+ "Content-Length": body ? JSON.stringify(body).length : 0,
105
+ "Content-Type": "application/json",
106
+ "User-Agent": getUserAgent(),
107
+ },
108
+ },
109
+ async (res) => {
110
+ const chunks: Buffer[] = [];
111
+ for await (const chunk of res) chunks.push(chunk);
112
+ const responseBody = Buffer.concat(chunks).toString();
113
+
114
+ if (res.statusCode && res.statusCode >= 400) {
115
+ reject(new Error(`HTTP ${res.statusCode}: ${responseBody}`));
116
+ return;
117
+ }
118
+
119
+ if (responseBody.length === 0) {
120
+ resolve(undefined as T);
121
+ return;
122
+ }
123
+
124
+ try {
125
+ resolve(JSON.parse(responseBody));
126
+ } catch (error) {
127
+ reject(error);
128
+ }
129
+ },
130
+ );
131
+ req.on("error", (error) => {
132
+ reject(error);
133
+ });
134
+
135
+ // Write the body to the request
136
+ req.end(body ? JSON.stringify(body) : "");
137
+ });
138
+ }
139
+ }
package/test-types.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { Render } from "./src";
2
+
3
+ export async function test() {
4
+ const render = new Render({
5
+ baseUrl: "https://api.localhost.render.com:8443",
6
+ token: "test",
7
+ });
8
+
9
+ const taskRun = await render.workflows.runTask("workflow-sdk/greet", ["Ruben"]);
10
+
11
+ // This should show the type
12
+ const taskRunType = typeof taskRun;
13
+ console.log(taskRunType);
14
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "exclude": ["node_modules", "dist", "**/*.test.ts"]
4
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "NodeNext",
5
+ "lib": ["ES2020"],
6
+ "declaration": true,
7
+ "declarationMap": true,
8
+ "outDir": "./dist",
9
+ "rootDir": "./src",
10
+ "removeComments": true,
11
+ "strict": true,
12
+ "esModuleInterop": true,
13
+ "skipLibCheck": true,
14
+ "forceConsistentCasingInFileNames": true,
15
+ "moduleResolution": "NodeNext",
16
+ "resolveJsonModule": true,
17
+ "experimentalDecorators": true,
18
+ "emitDecoratorMetadata": true,
19
+ "types": ["node", "vitest/globals"]
20
+ },
21
+ "include": ["src/**/*"],
22
+ "exclude": ["node_modules", "dist"]
23
+ }
@@ -0,0 +1,8 @@
1
+ import { defineConfig } from "vitest/config";
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ include: ["src/**/*.test.ts"],
6
+ globals: true,
7
+ },
8
+ });
@@ -1,25 +0,0 @@
1
- export declare class RenderError extends Error {
2
- constructor(message: string);
3
- }
4
- export declare class TaskRunError extends RenderError {
5
- taskRunId?: string | undefined;
6
- taskError?: string | undefined;
7
- constructor(message: string, taskRunId?: string | undefined, taskError?: string | undefined);
8
- }
9
- export declare class ClientError extends RenderError {
10
- statusCode: number;
11
- response?: any | undefined;
12
- constructor(message: string, statusCode: number, response?: any | undefined);
13
- }
14
- export declare class ServerError extends RenderError {
15
- statusCode: number;
16
- response?: any | undefined;
17
- constructor(message: string, statusCode: number, response?: any | undefined);
18
- }
19
- export declare class TimeoutError extends RenderError {
20
- constructor(message: string);
21
- }
22
- export declare class AbortError extends Error {
23
- constructor();
24
- }
25
- //# sourceMappingURL=errors.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/workflows/client/errors.ts"],"names":[],"mappings":"AAGA,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAK5B;AAKD,qBAAa,YAAa,SAAQ,WAAW;IAGlC,SAAS,CAAC,EAAE,MAAM;IAClB,SAAS,CAAC,EAAE,MAAM;gBAFzB,OAAO,EAAE,MAAM,EACR,SAAS,CAAC,EAAE,MAAM,YAAA,EAClB,SAAS,CAAC,EAAE,MAAM,YAAA;CAM5B;AAKD,qBAAa,WAAY,SAAQ,WAAW;IAGjC,UAAU,EAAE,MAAM;IAClB,QAAQ,CAAC,EAAE,GAAG;gBAFrB,OAAO,EAAE,MAAM,EACR,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,GAAG,YAAA;CAMxB;AAKD,qBAAa,WAAY,SAAQ,WAAW;IAGjC,UAAU,EAAE,MAAM;IAClB,QAAQ,CAAC,EAAE,GAAG;gBAFrB,OAAO,EAAE,MAAM,EACR,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,GAAG,YAAA;CAMxB;AAKD,qBAAa,YAAa,SAAQ,WAAW;gBAC/B,OAAO,EAAE,MAAM;CAK5B;AAED,qBAAa,UAAW,SAAQ,KAAK;;CAKpC"}
@@ -1,56 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AbortError = exports.TimeoutError = exports.ServerError = exports.ClientError = exports.TaskRunError = exports.RenderError = void 0;
4
- class RenderError extends Error {
5
- constructor(message) {
6
- super(message);
7
- this.name = 'RenderError';
8
- Object.setPrototypeOf(this, RenderError.prototype);
9
- }
10
- }
11
- exports.RenderError = RenderError;
12
- class TaskRunError extends RenderError {
13
- constructor(message, taskRunId, taskError) {
14
- super(message);
15
- this.taskRunId = taskRunId;
16
- this.taskError = taskError;
17
- this.name = 'TaskRunError';
18
- Object.setPrototypeOf(this, TaskRunError.prototype);
19
- }
20
- }
21
- exports.TaskRunError = TaskRunError;
22
- class ClientError extends RenderError {
23
- constructor(message, statusCode, response) {
24
- super(message);
25
- this.statusCode = statusCode;
26
- this.response = response;
27
- this.name = 'ClientError';
28
- Object.setPrototypeOf(this, ClientError.prototype);
29
- }
30
- }
31
- exports.ClientError = ClientError;
32
- class ServerError extends RenderError {
33
- constructor(message, statusCode, response) {
34
- super(message);
35
- this.statusCode = statusCode;
36
- this.response = response;
37
- this.name = 'ServerError';
38
- Object.setPrototypeOf(this, ServerError.prototype);
39
- }
40
- }
41
- exports.ServerError = ServerError;
42
- class TimeoutError extends RenderError {
43
- constructor(message) {
44
- super(message);
45
- this.name = 'TimeoutError';
46
- Object.setPrototypeOf(this, TimeoutError.prototype);
47
- }
48
- }
49
- exports.TimeoutError = TimeoutError;
50
- class AbortError extends Error {
51
- constructor() {
52
- super('The operation was aborted.');
53
- this.name = 'AbortError';
54
- }
55
- }
56
- exports.AbortError = AbortError;