@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.
Files changed (92) hide show
  1. package/README.md +159 -42
  2. package/dist/experimental/experimental.d.ts +2 -2
  3. package/dist/experimental/experimental.d.ts.map +1 -1
  4. package/dist/experimental/experimental.js +4 -4
  5. package/dist/experimental/object/api.d.ts +2 -1
  6. package/dist/experimental/object/api.d.ts.map +1 -1
  7. package/dist/experimental/object/api.js +20 -3
  8. package/dist/experimental/object/client.d.ts +11 -5
  9. package/dist/experimental/object/client.d.ts.map +1 -1
  10. package/dist/experimental/object/client.js +78 -13
  11. package/dist/experimental/object/e2e-helpers.d.ts +3 -0
  12. package/dist/experimental/object/e2e-helpers.d.ts.map +1 -0
  13. package/dist/experimental/object/e2e-helpers.js +70 -0
  14. package/dist/experimental/object/index.d.ts +1 -1
  15. package/dist/experimental/object/index.d.ts.map +1 -1
  16. package/dist/experimental/object/types.d.ts +18 -0
  17. package/dist/experimental/object/types.d.ts.map +1 -1
  18. package/dist/generated/schema.d.ts +167 -28
  19. package/dist/generated/schema.d.ts.map +1 -1
  20. package/dist/render.d.ts.map +1 -1
  21. package/dist/render.js +3 -1
  22. package/dist/workflows/client/client.d.ts +7 -3
  23. package/dist/workflows/client/client.d.ts.map +1 -1
  24. package/dist/workflows/client/client.js +96 -15
  25. package/dist/workflows/client/index.d.ts +2 -0
  26. package/dist/workflows/client/index.d.ts.map +1 -1
  27. package/dist/workflows/client/index.js +5 -1
  28. package/dist/workflows/client/sse.d.ts +0 -7
  29. package/dist/workflows/client/sse.d.ts.map +1 -1
  30. package/dist/workflows/client/sse.js +1 -71
  31. package/dist/workflows/client/task-run-promise.d.ts +12 -0
  32. package/dist/workflows/client/task-run-promise.d.ts.map +1 -0
  33. package/dist/workflows/client/task-run-promise.js +22 -0
  34. package/dist/workflows/client/task-run-result.d.ts +10 -0
  35. package/dist/workflows/client/task-run-result.d.ts.map +1 -0
  36. package/dist/workflows/client/task-run-result.js +18 -0
  37. package/dist/workflows/client/types.d.ts +2 -0
  38. package/dist/workflows/client/types.d.ts.map +1 -1
  39. package/dist/workflows/uds.d.ts +1 -0
  40. package/dist/workflows/uds.d.ts.map +1 -1
  41. package/dist/workflows/uds.js +30 -2
  42. package/dist/workflows/workflows.d.ts +19 -0
  43. package/dist/workflows/workflows.d.ts.map +1 -0
  44. package/dist/workflows/workflows.js +51 -0
  45. package/package.json +5 -1
  46. package/CHANGELOG.md +0 -33
  47. package/biome.json +0 -84
  48. package/examples/client/main.ts +0 -42
  49. package/examples/client/package-lock.json +0 -601
  50. package/examples/client/package.json +0 -16
  51. package/examples/client/tsconfig.json +0 -17
  52. package/examples/task/main.ts +0 -90
  53. package/examples/task/package-lock.json +0 -584
  54. package/examples/task/package.json +0 -16
  55. package/examples/task/tsconfig.json +0 -17
  56. package/src/errors.test.ts +0 -75
  57. package/src/errors.ts +0 -73
  58. package/src/experimental/experimental.ts +0 -56
  59. package/src/experimental/index.ts +0 -24
  60. package/src/experimental/object/api.ts +0 -91
  61. package/src/experimental/object/client.test.ts +0 -138
  62. package/src/experimental/object/client.ts +0 -317
  63. package/src/experimental/object/index.ts +0 -22
  64. package/src/experimental/object/types.test.ts +0 -87
  65. package/src/experimental/object/types.ts +0 -131
  66. package/src/generated/schema.ts +0 -12937
  67. package/src/index.ts +0 -7
  68. package/src/render.ts +0 -35
  69. package/src/utils/create-api-client.ts +0 -13
  70. package/src/utils/get-base-url.test.ts +0 -58
  71. package/src/utils/get-base-url.ts +0 -16
  72. package/src/version.ts +0 -37
  73. package/src/workflows/client/client.test.ts +0 -68
  74. package/src/workflows/client/client.ts +0 -142
  75. package/src/workflows/client/create-client.ts +0 -17
  76. package/src/workflows/client/index.ts +0 -3
  77. package/src/workflows/client/sse.ts +0 -95
  78. package/src/workflows/client/types.ts +0 -56
  79. package/src/workflows/executor.ts +0 -124
  80. package/src/workflows/index.ts +0 -7
  81. package/src/workflows/registry.test.ts +0 -76
  82. package/src/workflows/registry.ts +0 -88
  83. package/src/workflows/runner.ts +0 -38
  84. package/src/workflows/schema.ts +0 -348
  85. package/src/workflows/task.ts +0 -117
  86. package/src/workflows/types.test.ts +0 -52
  87. package/src/workflows/types.ts +0 -89
  88. package/src/workflows/uds.ts +0 -139
  89. package/test-types.ts +0 -14
  90. package/tsconfig.build.json +0 -4
  91. package/tsconfig.json +0 -23
  92. package/vitest.config.ts +0 -8
@@ -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;CAYpC"}
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
- this.experimental = new experimental_js_1.ExperimentalClient(this.apiClient);
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
- private cancelTaskRun;
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":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,eAAe,CAAC;AAEzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAEvD,OAAO,KAAK,EACV,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,OAAO,EACP,cAAc,EACf,MAAM,YAAY,CAAC;AAoBpB,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;gBAOjC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAKjE,OAAO,CACX,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,QAAQ,EACnB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC;YA4CZ,WAAW;IAUnB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;YAe9C,aAAa;IAerB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CASnE"}
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 runTask(taskIdentifier, inputData, signal) {
26
+ async *taskRunEvents(taskRunIds, signal) {
23
27
  if (signal?.aborted) {
24
28
  throw new errors_js_1.AbortError();
25
29
  }
26
- let taskRunId = null;
27
- const abortHandler = async () => {
28
- if (taskRunId) {
29
- await this.cancelTaskRun(taskRunId);
30
- throw new errors_js_1.AbortError();
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
- taskRunId = data.id;
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 waitForTask(taskRunId, signal) {
59
- return this.sse.waitOnTaskRun(taskRunId, signal);
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,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,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM;IAG1B,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;CAsEtF"}
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.SSEClient = exports.TaskEventType = void 0;
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;
@@ -19,5 +19,7 @@ export interface ClientOptions {
19
19
  baseUrl?: string;
20
20
  useLocalDev?: boolean;
21
21
  localDevUrl?: string;
22
+ ownerId?: string;
23
+ region?: string;
22
24
  }
23
25
  //# sourceMappingURL=types.d.ts.map
@@ -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;CACtB"}
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"}
@@ -9,5 +9,6 @@ export declare class UDSClient {
9
9
  getSubtaskResult(subtaskId: string): Promise<GetSubtaskResultResponse>;
10
10
  registerTasks(tasks: TaskMetadata[]): Promise<void>;
11
11
  private request;
12
+ private requestOnce;
12
13
  }
13
14
  //# sourceMappingURL=uds.d.ts.map
@@ -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;AAKpB,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;CA2CtB"}
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"}
@@ -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": body ? JSON.stringify(body).length : 0,
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(body ? JSON.stringify(body) : "");
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.2.1",
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