@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
package/README.md
ADDED
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
# Render Workflow SDK for TypeScript
|
|
2
|
+
|
|
3
|
+
The official TypeScript SDK for Render Workflows, providing a simple and intuitive API for managing and executing tasks.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **REST API Client**: Run, monitor, and manage task runs
|
|
8
|
+
- **Task Definition SDK**: Define and register tasks with decorators
|
|
9
|
+
- **Server-Sent Events**: Real-time streaming of task run events
|
|
10
|
+
- **Async/Await Support**: Modern Promise-based API
|
|
11
|
+
- **TypeScript First**: Full type safety and IntelliSense support
|
|
12
|
+
- **Retry Logic**: Configurable retry behavior for tasks
|
|
13
|
+
- **Subtask Execution**: Execute tasks from within other tasks
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @renderinc/sdk
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Or with yarn:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
yarn add @renderinc/sdk
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Or with pnpm:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pnpm add @renderinc/sdk
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Quick Start
|
|
34
|
+
|
|
35
|
+
### REST API Client
|
|
36
|
+
|
|
37
|
+
Use the Render SDK to run tasks and monitor their execution:
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { Render } from '@renderinc/sdk';
|
|
41
|
+
|
|
42
|
+
// Create a Render SDK instance (uses RENDER_API_KEY from environment)
|
|
43
|
+
const render = new Render();
|
|
44
|
+
|
|
45
|
+
// Run a task and wait for completion
|
|
46
|
+
const result = await render.workflows.runTask('my-workflow/my-task', [42, 'hello']);
|
|
47
|
+
console.log('Status:', result.status);
|
|
48
|
+
console.log('Results:', result.results);
|
|
49
|
+
|
|
50
|
+
// List recent task runs
|
|
51
|
+
const taskRuns = await render.workflows.listTaskRuns({ limit: 10 });
|
|
52
|
+
|
|
53
|
+
// Get specific task run
|
|
54
|
+
const details = await render.workflows.getTaskRun(result.id);
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Alternatively, you can create a workflows client directly:
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
import { createWorkflowsClient } from '@renderinc/sdk/workflows';
|
|
61
|
+
|
|
62
|
+
const client = createWorkflowsClient();
|
|
63
|
+
const result = await client.runTask('my-workflow/my-task', [42, 'hello']);
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Task Definition
|
|
67
|
+
|
|
68
|
+
Define tasks that can be executed by the workflow system:
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
import { task, startTaskServer } from '@renderinc/sdk/workflows';
|
|
72
|
+
|
|
73
|
+
// Simple task
|
|
74
|
+
const square = task(
|
|
75
|
+
{ name: 'square' },
|
|
76
|
+
function square(a: number): number {
|
|
77
|
+
return a * a;
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
// Async task with subtask execution
|
|
82
|
+
task(
|
|
83
|
+
{ name: 'addSquares' },
|
|
84
|
+
async function addSquares(a: number, b: number): Promise<number> {
|
|
85
|
+
const result1 = await square(a);
|
|
86
|
+
const result2 = await square(b);
|
|
87
|
+
return result1 + result2;
|
|
88
|
+
}
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
// Task with custom options
|
|
92
|
+
task(
|
|
93
|
+
{
|
|
94
|
+
name: 'retryableTask',
|
|
95
|
+
retry: {
|
|
96
|
+
maxRetries: 3,
|
|
97
|
+
waitDurationMs: 1000,
|
|
98
|
+
factor: 1.5,
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
async function retryableTask(input: string): Promise<string> {
|
|
102
|
+
// Task implementation
|
|
103
|
+
return input.toUpperCase();
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
// Start the task server
|
|
108
|
+
await startTaskServer();
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## API Reference
|
|
112
|
+
|
|
113
|
+
### Render SDK
|
|
114
|
+
|
|
115
|
+
#### `new Render(options?)`
|
|
116
|
+
|
|
117
|
+
Creates a new Render SDK instance with access to all Render products.
|
|
118
|
+
|
|
119
|
+
**Options:**
|
|
120
|
+
- `token?: string` - API token (defaults to `RENDER_API_KEY` env var)
|
|
121
|
+
- `baseUrl?: string` - Base URL (defaults to `https://api.render.com`)
|
|
122
|
+
- `useLocalDev?: boolean` - Use local development mode
|
|
123
|
+
- `localDevUrl?: string` - Local development URL
|
|
124
|
+
|
|
125
|
+
**Properties:**
|
|
126
|
+
- `workflows` - WorkflowsClient instance for managing workflow tasks
|
|
127
|
+
|
|
128
|
+
**Example:**
|
|
129
|
+
```typescript
|
|
130
|
+
import { Render } from '@renderinc/sdk';
|
|
131
|
+
|
|
132
|
+
const render = new Render({
|
|
133
|
+
token: 'your-api-token',
|
|
134
|
+
baseUrl: 'https://api.render.com',
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
// Access workflows client
|
|
138
|
+
const result = await render.workflows.runTask('my-workflow/task', [42]);
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Workflows Client API
|
|
142
|
+
|
|
143
|
+
The workflows client is accessible via `render.workflows` or can be created directly using `createWorkflowsClient`:
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
import { createWorkflowsClient } from '@renderinc/sdk/workflows';
|
|
147
|
+
|
|
148
|
+
const client = createWorkflowsClient({
|
|
149
|
+
token: 'your-api-token',
|
|
150
|
+
baseUrl: 'https://api.render.com',
|
|
151
|
+
});
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Workflows Client Methods
|
|
155
|
+
|
|
156
|
+
#### `render.workflows.runTask(taskIdentifier, inputData, signal?)`
|
|
157
|
+
|
|
158
|
+
Runs a task and waits for completion.
|
|
159
|
+
|
|
160
|
+
**Parameters:**
|
|
161
|
+
- `taskIdentifier: string` - Task identifier in format "workflow-slug/task-name"
|
|
162
|
+
- `inputData: any[]` - Input data as array of parameters
|
|
163
|
+
- `signal?: AbortSignal` - Optional abort signal for cancellation
|
|
164
|
+
|
|
165
|
+
**Returns:** `Promise<TaskRunDetails>`
|
|
166
|
+
|
|
167
|
+
**Example:**
|
|
168
|
+
```typescript
|
|
169
|
+
const render = new Render();
|
|
170
|
+
const result = await render.workflows.runTask('my-workflow/square', [5]);
|
|
171
|
+
console.log('Results:', result.results);
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
#### `render.workflows.getTaskRun(taskRunId)`
|
|
175
|
+
|
|
176
|
+
Gets task run details by ID.
|
|
177
|
+
|
|
178
|
+
**Parameters:**
|
|
179
|
+
- `taskRunId: string` - Task run ID
|
|
180
|
+
|
|
181
|
+
**Returns:** `Promise<TaskRunDetails>`
|
|
182
|
+
|
|
183
|
+
**Example:**
|
|
184
|
+
```typescript
|
|
185
|
+
const render = new Render();
|
|
186
|
+
const details = await render.workflows.getTaskRun('task-run-id');
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
#### `render.workflows.listTaskRuns(params)`
|
|
190
|
+
|
|
191
|
+
Lists task runs with optional filters.
|
|
192
|
+
|
|
193
|
+
**Parameters:**
|
|
194
|
+
- `params.limit?: number` - Maximum number of results
|
|
195
|
+
- `params.cursor?: string` - Pagination cursor
|
|
196
|
+
- `params.ownerId?: string[]` - Filter by owner IDs
|
|
197
|
+
|
|
198
|
+
**Returns:** `Promise<TaskRun[]>`
|
|
199
|
+
|
|
200
|
+
**Example:**
|
|
201
|
+
```typescript
|
|
202
|
+
const render = new Render();
|
|
203
|
+
const taskRuns = await render.workflows.listTaskRuns({ limit: 10 });
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Task API
|
|
207
|
+
|
|
208
|
+
#### `task(options, func)`
|
|
209
|
+
|
|
210
|
+
Registers a function as a task.
|
|
211
|
+
|
|
212
|
+
**Parameters:**
|
|
213
|
+
- `options: RegisterTaskOptions` - Task configuration
|
|
214
|
+
- `name: string` - Task name (required)
|
|
215
|
+
- `retry?: RetryOptions` - Optional retry configuration
|
|
216
|
+
- `maxRetries: number` - Maximum number of retries
|
|
217
|
+
- `waitDurationMs: number` - Wait duration between retries in milliseconds
|
|
218
|
+
- `factor?: number` - Backoff factor (default: 1.5)
|
|
219
|
+
- `func: TaskFunction` - The task function to register
|
|
220
|
+
|
|
221
|
+
**Returns:** The registered function with the same signature
|
|
222
|
+
|
|
223
|
+
**Usage:**
|
|
224
|
+
```typescript
|
|
225
|
+
// Basic usage
|
|
226
|
+
const myTask = task(
|
|
227
|
+
{ name: 'myTask' },
|
|
228
|
+
function myTask(arg: string): string {
|
|
229
|
+
return arg.toUpperCase();
|
|
230
|
+
}
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
// With retry options
|
|
234
|
+
task(
|
|
235
|
+
{
|
|
236
|
+
name: 'retryableTask',
|
|
237
|
+
retry: {
|
|
238
|
+
maxRetries: 3,
|
|
239
|
+
waitDurationMs: 1000,
|
|
240
|
+
factor: 1.5,
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
function retryableTask(arg: string): string {
|
|
244
|
+
return arg.toUpperCase();
|
|
245
|
+
}
|
|
246
|
+
);
|
|
247
|
+
|
|
248
|
+
// Async task with subtasks
|
|
249
|
+
const square = task(
|
|
250
|
+
{ name: 'square' },
|
|
251
|
+
function square(a: number): number {
|
|
252
|
+
return a * a;
|
|
253
|
+
}
|
|
254
|
+
);
|
|
255
|
+
|
|
256
|
+
task(
|
|
257
|
+
{ name: 'addSquares' },
|
|
258
|
+
async function addSquares(a: number, b: number): Promise<number> {
|
|
259
|
+
const result1 = await square(a);
|
|
260
|
+
const result2 = await square(b);
|
|
261
|
+
return result1 + result2;
|
|
262
|
+
}
|
|
263
|
+
);
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
#### `startTaskServer()`
|
|
267
|
+
|
|
268
|
+
Starts the task server and listens for task execution requests.
|
|
269
|
+
|
|
270
|
+
**Returns:** `Promise<void>`
|
|
271
|
+
|
|
272
|
+
**Example:**
|
|
273
|
+
```typescript
|
|
274
|
+
await startTaskServer();
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### Types
|
|
278
|
+
|
|
279
|
+
#### `TaskRunStatus`
|
|
280
|
+
|
|
281
|
+
```typescript
|
|
282
|
+
enum TaskRunStatus {
|
|
283
|
+
PENDING = 'pending',
|
|
284
|
+
RUNNING = 'running',
|
|
285
|
+
COMPLETED = 'completed',
|
|
286
|
+
FAILED = 'failed',
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
#### `TaskRun`
|
|
291
|
+
|
|
292
|
+
```typescript
|
|
293
|
+
interface TaskRun {
|
|
294
|
+
id: string;
|
|
295
|
+
status: TaskRunStatus;
|
|
296
|
+
created_at: string;
|
|
297
|
+
updated_at: string;
|
|
298
|
+
task_identifier: string;
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
#### `TaskRunDetails`
|
|
303
|
+
|
|
304
|
+
```typescript
|
|
305
|
+
interface TaskRunDetails extends TaskRun {
|
|
306
|
+
completed_at?: string;
|
|
307
|
+
results?: any[];
|
|
308
|
+
error?: string;
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
#### `RegisterTaskOptions`
|
|
313
|
+
|
|
314
|
+
```typescript
|
|
315
|
+
interface RegisterTaskOptions {
|
|
316
|
+
name: string;
|
|
317
|
+
retry?: {
|
|
318
|
+
maxRetries: number;
|
|
319
|
+
waitDurationMs: number;
|
|
320
|
+
factor?: number; // default 1.5
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### Error Handling
|
|
326
|
+
|
|
327
|
+
The SDK provides several error classes:
|
|
328
|
+
|
|
329
|
+
```typescript
|
|
330
|
+
import { Render } from '@renderinc/sdk';
|
|
331
|
+
import {
|
|
332
|
+
RenderError,
|
|
333
|
+
ClientError,
|
|
334
|
+
ServerError,
|
|
335
|
+
AbortError,
|
|
336
|
+
} from '@renderinc/sdk';
|
|
337
|
+
|
|
338
|
+
const render = new Render();
|
|
339
|
+
|
|
340
|
+
try {
|
|
341
|
+
const result = await render.workflows.runTask('my-workflow/task', [42]);
|
|
342
|
+
} catch (error) {
|
|
343
|
+
if (error instanceof ClientError) {
|
|
344
|
+
console.error('Client error:', error.statusCode, error.cause);
|
|
345
|
+
} else if (error instanceof ServerError) {
|
|
346
|
+
console.error('Server error:', error.statusCode, error.cause);
|
|
347
|
+
} else if (error instanceof AbortError) {
|
|
348
|
+
console.error('Request was aborted');
|
|
349
|
+
} else if (error instanceof RenderError) {
|
|
350
|
+
console.error('General SDK error:', error.message);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
## Environment Variables
|
|
356
|
+
|
|
357
|
+
- `RENDER_API_KEY` - Your Render API key (required)
|
|
358
|
+
- `RENDER_USE_LOCAL_DEV` - Enable local development mode (`true`/`false`)
|
|
359
|
+
- `RENDER_LOCAL_DEV_URL` - Local development URL (default: `http://localhost:8120`)
|
|
360
|
+
- `RENDER_SDK_MODE` - Task execution mode (`run` or `register`)
|
|
361
|
+
- `RENDER_SDK_SOCKET_PATH` - Unix socket path for task communication
|
|
362
|
+
|
|
363
|
+
## Examples
|
|
364
|
+
|
|
365
|
+
### Example 1: Running a Task
|
|
366
|
+
|
|
367
|
+
```typescript
|
|
368
|
+
import { Render } from '@renderinc/sdk';
|
|
369
|
+
|
|
370
|
+
const render = new Render();
|
|
371
|
+
|
|
372
|
+
async function runSquareTask() {
|
|
373
|
+
const result = await render.workflows.runTask('my-workflow/square', [5]);
|
|
374
|
+
console.log('Square of 5 is:', result.results[0]); // 25
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
runSquareTask();
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### Example 2: Defining Tasks with Subtasks
|
|
381
|
+
|
|
382
|
+
```typescript
|
|
383
|
+
import { task, startTaskServer } from '@renderinc/sdk/workflows';
|
|
384
|
+
|
|
385
|
+
const square = task(
|
|
386
|
+
{ name: 'square' },
|
|
387
|
+
function square(a: number): number {
|
|
388
|
+
return a * a;
|
|
389
|
+
}
|
|
390
|
+
);
|
|
391
|
+
|
|
392
|
+
task(
|
|
393
|
+
{ name: 'pythagorean' },
|
|
394
|
+
async function pythagorean(a: number, b: number): Promise<number> {
|
|
395
|
+
const aSquared = await square(a);
|
|
396
|
+
const bSquared = await square(b);
|
|
397
|
+
return Math.sqrt(aSquared + bSquared);
|
|
398
|
+
}
|
|
399
|
+
);
|
|
400
|
+
|
|
401
|
+
await startTaskServer();
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
### Example 3: Error Handling in Tasks
|
|
405
|
+
|
|
406
|
+
```typescript
|
|
407
|
+
import { task } from '@renderinc/sdk/workflows';
|
|
408
|
+
|
|
409
|
+
const divide = task(
|
|
410
|
+
{ name: 'divide' },
|
|
411
|
+
async function divide(a: number, b: number): Promise<number> {
|
|
412
|
+
if (b === 0) {
|
|
413
|
+
throw new Error('Cannot divide by zero');
|
|
414
|
+
}
|
|
415
|
+
return a / b;
|
|
416
|
+
}
|
|
417
|
+
);
|
|
418
|
+
|
|
419
|
+
task(
|
|
420
|
+
{
|
|
421
|
+
name: 'safeDivide',
|
|
422
|
+
retry: {
|
|
423
|
+
maxRetries: 3,
|
|
424
|
+
waitDurationMs: 1000,
|
|
425
|
+
},
|
|
426
|
+
},
|
|
427
|
+
async function safeDivide(a: number, b: number): Promise<number> {
|
|
428
|
+
try {
|
|
429
|
+
return await divide(a, b);
|
|
430
|
+
} catch (error) {
|
|
431
|
+
console.error('Division failed:', error);
|
|
432
|
+
return 0; // Return default value
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
);
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
### Example 4: Using AbortSignal for Cancellation
|
|
439
|
+
|
|
440
|
+
```typescript
|
|
441
|
+
import { Render, AbortError } from '@renderinc/sdk';
|
|
442
|
+
|
|
443
|
+
const render = new Render();
|
|
444
|
+
|
|
445
|
+
async function runTaskWithCancellation() {
|
|
446
|
+
const abortController = new AbortController();
|
|
447
|
+
|
|
448
|
+
// Cancel the task after 5 seconds
|
|
449
|
+
setTimeout(() => abortController.abort(), 5000);
|
|
450
|
+
|
|
451
|
+
try {
|
|
452
|
+
const result = await render.workflows.runTask(
|
|
453
|
+
'my-workflow/long-running-task',
|
|
454
|
+
[42],
|
|
455
|
+
abortController.signal
|
|
456
|
+
);
|
|
457
|
+
console.log('Task completed:', result.results);
|
|
458
|
+
} catch (error) {
|
|
459
|
+
if (error instanceof AbortError) {
|
|
460
|
+
console.log('Task was cancelled');
|
|
461
|
+
} else {
|
|
462
|
+
console.error('Task failed:', error);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
runTaskWithCancellation();
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
### Example 5: Using the Unified Render SDK
|
|
471
|
+
|
|
472
|
+
```typescript
|
|
473
|
+
import { Render } from '@renderinc/sdk';
|
|
474
|
+
|
|
475
|
+
// Single entry point for all Render products
|
|
476
|
+
const render = new Render({
|
|
477
|
+
token: process.env.RENDER_API_KEY,
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
async function workflowExample() {
|
|
481
|
+
try {
|
|
482
|
+
// Run a workflow task
|
|
483
|
+
const result = await render.workflows.runTask('my-workflow/process-data', [
|
|
484
|
+
{ userId: 123, data: 'example' },
|
|
485
|
+
]);
|
|
486
|
+
|
|
487
|
+
console.log('Workflow completed:', result.status);
|
|
488
|
+
console.log('Results:', result.results);
|
|
489
|
+
|
|
490
|
+
// List and monitor recent task runs
|
|
491
|
+
const recentRuns = await render.workflows.listTaskRuns({ limit: 5 });
|
|
492
|
+
console.log(`\nRecent task runs: ${recentRuns.length}`);
|
|
493
|
+
|
|
494
|
+
for (const run of recentRuns) {
|
|
495
|
+
const details = await render.workflows.getTaskRun(run.id);
|
|
496
|
+
console.log(`- ${run.taskId}: ${details.status}`);
|
|
497
|
+
}
|
|
498
|
+
} catch (error) {
|
|
499
|
+
console.error('Error:', error);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
workflowExample();
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
## Development
|
|
507
|
+
|
|
508
|
+
### Building
|
|
509
|
+
|
|
510
|
+
```bash
|
|
511
|
+
npm run build
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
### Testing
|
|
515
|
+
|
|
516
|
+
```bash
|
|
517
|
+
npm test
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
### Linting
|
|
521
|
+
|
|
522
|
+
```bash
|
|
523
|
+
npm run lint
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
### Formatting
|
|
527
|
+
|
|
528
|
+
```bash
|
|
529
|
+
npm run format
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
## Project Structure
|
|
533
|
+
|
|
534
|
+
```
|
|
535
|
+
typescript/
|
|
536
|
+
├── src/
|
|
537
|
+
│ ├── render.ts # Main Render SDK class
|
|
538
|
+
│ ├── index.ts # Main exports
|
|
539
|
+
│ └── workflows/ # Workflows functionality
|
|
540
|
+
│ ├── client/ # REST API client
|
|
541
|
+
│ │ ├── client.ts # WorkflowsClient class
|
|
542
|
+
│ │ ├── workflows.ts # WorkflowsService
|
|
543
|
+
│ │ ├── sse.ts # SSE client
|
|
544
|
+
│ │ ├── types.ts # Type definitions
|
|
545
|
+
│ │ ├── errors.ts # Error classes
|
|
546
|
+
│ │ └── index.ts # Exports
|
|
547
|
+
│ ├── task/ # Task execution SDK
|
|
548
|
+
│ │ ├── task.ts # task() function
|
|
549
|
+
│ │ ├── runner.ts # start() and run()
|
|
550
|
+
│ │ ├── executor.ts # TaskExecutor
|
|
551
|
+
│ │ ├── registry.ts # TaskRegistry
|
|
552
|
+
│ │ ├── uds.ts # Unix socket client
|
|
553
|
+
│ │ ├── types.ts # Type definitions
|
|
554
|
+
│ │ └── index.ts # Exports
|
|
555
|
+
│ └── index.ts # Workflows exports
|
|
556
|
+
├── examples/
|
|
557
|
+
│ ├── client/ # Client example
|
|
558
|
+
│ │ ├── main.ts
|
|
559
|
+
│ │ └── package.json
|
|
560
|
+
│ └── task/ # Task example
|
|
561
|
+
│ ├── main.ts
|
|
562
|
+
│ └── package.json
|
|
563
|
+
├── package.json
|
|
564
|
+
├── tsconfig.json
|
|
565
|
+
└── README.md
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
## License
|
|
569
|
+
|
|
570
|
+
MIT
|
|
571
|
+
|
|
572
|
+
## Support
|
|
573
|
+
|
|
574
|
+
For issues and questions, please visit:
|
|
575
|
+
- GitHub Issues: https://github.com/renderinc/workflow-sdk/issues
|
|
576
|
+
- Documentation: https://render.com/docs/workflows
|
|
577
|
+
|
|
578
|
+
## Contributing
|
|
579
|
+
|
|
580
|
+
Contributions are welcome! Please read our contributing guidelines before submitting pull requests.
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/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"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
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;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,cAAc,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
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.Render = void 0;
|
|
18
|
+
var render_js_1 = require("./render.js");
|
|
19
|
+
Object.defineProperty(exports, "Render", { enumerable: true, get: function () { return render_js_1.Render; } });
|
|
20
|
+
__exportStar(require("./errors.js"), exports);
|
package/dist/render.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { WorkflowsClient } from "./workflows/client/index.js";
|
|
2
|
+
import type { ClientOptions } from "./workflows/client/types.js";
|
|
3
|
+
export declare class Render {
|
|
4
|
+
readonly workflows: WorkflowsClient;
|
|
5
|
+
private readonly apiClient;
|
|
6
|
+
constructor(options?: ClientOptions);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AASjE,qBAAa,MAAM;IACjB,SAAgB,SAAS,EAAE,eAAe,CAAC;IAE3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;gBAM9B,OAAO,CAAC,EAAE,aAAa;CAWpC"}
|