@rendobar/sdk 4.1.0 → 5.0.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/dist/index.cjs +114 -83
- package/dist/index.d.cts +175 -84
- package/dist/index.d.mts +175 -84
- package/dist/index.mjs +114 -83
- package/package.json +4 -3
package/dist/index.mjs
CHANGED
|
@@ -5,6 +5,10 @@ import { WebSocket } from "partysocket";
|
|
|
5
5
|
* Use isApiError() to narrow in catch blocks.
|
|
6
6
|
*/
|
|
7
7
|
var ApiError = class extends Error {
|
|
8
|
+
code;
|
|
9
|
+
statusCode;
|
|
10
|
+
details;
|
|
11
|
+
retryAfter;
|
|
8
12
|
constructor(code, statusCode, message, details, retryAfter) {
|
|
9
13
|
super(message);
|
|
10
14
|
this.code = code;
|
|
@@ -52,7 +56,7 @@ var JobFailedError = class extends Error {
|
|
|
52
56
|
const DEFAULT_TIMEOUT = 3e4;
|
|
53
57
|
const DEFAULT_MAX_RETRIES = 2;
|
|
54
58
|
const RETRY_BASE_DELAY = 500;
|
|
55
|
-
const RETRYABLE_STATUS_CODES = new Set([
|
|
59
|
+
const RETRYABLE_STATUS_CODES = /* @__PURE__ */ new Set([
|
|
56
60
|
429,
|
|
57
61
|
500,
|
|
58
62
|
502,
|
|
@@ -171,90 +175,101 @@ function isAbortError(error) {
|
|
|
171
175
|
}
|
|
172
176
|
//#endregion
|
|
173
177
|
//#region src/resources/jobs.ts
|
|
174
|
-
const
|
|
178
|
+
const TERMINAL_JOB_STATUSES$1 = /* @__PURE__ */ new Set([
|
|
175
179
|
"complete",
|
|
176
180
|
"failed",
|
|
177
181
|
"cancelled"
|
|
178
182
|
]);
|
|
179
183
|
function createJobsResource(request) {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
});
|
|
187
|
-
},
|
|
188
|
-
async get(id, options) {
|
|
189
|
-
return request(`/jobs/${id}`, { signal: options?.signal });
|
|
190
|
-
},
|
|
191
|
-
async list(params, options) {
|
|
192
|
-
return request("/jobs", {
|
|
193
|
-
query: params,
|
|
194
|
-
signal: options?.signal
|
|
195
|
-
});
|
|
196
|
-
},
|
|
197
|
-
async *listAll(params) {
|
|
198
|
-
let offset = 0;
|
|
199
|
-
const limit = params?.limit ?? 50;
|
|
200
|
-
while (true) {
|
|
201
|
-
const page = await request("/jobs", { query: {
|
|
202
|
-
...params,
|
|
203
|
-
limit,
|
|
204
|
-
offset
|
|
205
|
-
} });
|
|
206
|
-
for (const job of page.data) yield job;
|
|
207
|
-
if (offset + page.data.length >= page.meta.total) break;
|
|
208
|
-
offset += limit;
|
|
209
|
-
}
|
|
210
|
-
},
|
|
211
|
-
async wait(id, options = {}) {
|
|
212
|
-
const { timeout = 3e5, interval = 2e3, maxInterval = 1e4, onProgress, signal, throwOnFailure = false } = options;
|
|
213
|
-
const deadline = Date.now() + timeout;
|
|
214
|
-
let currentInterval = interval;
|
|
215
|
-
while (Date.now() < deadline) {
|
|
216
|
-
if (signal?.aborted) throw new DOMException("Wait aborted", "AbortError");
|
|
217
|
-
const job = await request(`/jobs/${id}`, { signal });
|
|
218
|
-
onProgress?.(job);
|
|
219
|
-
if (TERMINAL_STATUSES$1.has(job.status)) return resolveTerminal(id, job, throwOnFailure);
|
|
220
|
-
const remaining = deadline - Date.now();
|
|
221
|
-
const delay = Math.min(currentInterval, remaining);
|
|
222
|
-
if (delay <= 0) break;
|
|
223
|
-
await sleep(delay, signal);
|
|
224
|
-
currentInterval = Math.min(currentInterval * 1.5, maxInterval);
|
|
225
|
-
}
|
|
184
|
+
async function wait(id, options = {}) {
|
|
185
|
+
const { timeout = 3e5, interval = 2e3, maxInterval = 1e4, onProgress, signal, throwOnFailure = false } = options;
|
|
186
|
+
const deadline = Date.now() + timeout;
|
|
187
|
+
let currentInterval = interval;
|
|
188
|
+
while (Date.now() < deadline) {
|
|
189
|
+
if (signal?.aborted) throw new DOMException("Wait aborted", "AbortError");
|
|
226
190
|
const job = await request(`/jobs/${id}`, { signal });
|
|
227
191
|
onProgress?.(job);
|
|
228
|
-
if (
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
192
|
+
if (TERMINAL_JOB_STATUSES$1.has(job.status)) return resolveTerminal(id, job, throwOnFailure);
|
|
193
|
+
const remaining = deadline - Date.now();
|
|
194
|
+
const delay = Math.min(currentInterval, remaining);
|
|
195
|
+
if (delay <= 0) break;
|
|
196
|
+
await sleep(delay, signal);
|
|
197
|
+
currentInterval = Math.min(currentInterval * 1.5, maxInterval);
|
|
198
|
+
}
|
|
199
|
+
const job = await request(`/jobs/${id}`, { signal });
|
|
200
|
+
onProgress?.(job);
|
|
201
|
+
if (TERMINAL_JOB_STATUSES$1.has(job.status)) return resolveTerminal(id, job, throwOnFailure);
|
|
202
|
+
throw new WaitTimeoutError(id, job.status, timeout);
|
|
203
|
+
}
|
|
204
|
+
async function create(params, options) {
|
|
205
|
+
return request("/jobs", {
|
|
206
|
+
method: "POST",
|
|
207
|
+
body: params,
|
|
208
|
+
signal: options?.signal
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
async function get(id, options) {
|
|
212
|
+
return request(`/jobs/${id}`, { signal: options?.signal });
|
|
213
|
+
}
|
|
214
|
+
async function list(params, options) {
|
|
215
|
+
return request("/jobs", {
|
|
216
|
+
query: params,
|
|
217
|
+
signal: options?.signal
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
async function* listAll(params) {
|
|
221
|
+
let offset = 0;
|
|
222
|
+
const limit = params?.limit ?? 50;
|
|
223
|
+
while (true) {
|
|
224
|
+
const page = await request("/jobs", { query: {
|
|
225
|
+
...params,
|
|
226
|
+
limit,
|
|
227
|
+
offset
|
|
228
|
+
} });
|
|
229
|
+
for (const job of page.data) yield job;
|
|
230
|
+
if (offset + page.data.length >= page.meta.total) break;
|
|
231
|
+
offset += limit;
|
|
257
232
|
}
|
|
233
|
+
}
|
|
234
|
+
async function cancel(id, options) {
|
|
235
|
+
return request(`/jobs/${id}/cancel`, {
|
|
236
|
+
method: "POST",
|
|
237
|
+
signal: options?.signal
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
async function download(id, options) {
|
|
241
|
+
return request(`/jobs/${id}/download`, {
|
|
242
|
+
raw: true,
|
|
243
|
+
signal: options?.signal
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
async function logs(id, options) {
|
|
247
|
+
return request(`/jobs/${id}/logs`, { signal: options?.signal });
|
|
248
|
+
}
|
|
249
|
+
async function getTimings(id, options) {
|
|
250
|
+
return request(`/jobs/${id}/timings`, { signal: options?.signal });
|
|
251
|
+
}
|
|
252
|
+
async function types(options) {
|
|
253
|
+
return request("/jobs/types", { signal: options?.signal });
|
|
254
|
+
}
|
|
255
|
+
async function stats(params, options) {
|
|
256
|
+
return request("/jobs/stats", {
|
|
257
|
+
query: params,
|
|
258
|
+
signal: options?.signal
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
create,
|
|
263
|
+
get,
|
|
264
|
+
list,
|
|
265
|
+
listAll,
|
|
266
|
+
wait,
|
|
267
|
+
cancel,
|
|
268
|
+
download,
|
|
269
|
+
logs,
|
|
270
|
+
getTimings,
|
|
271
|
+
types,
|
|
272
|
+
stats
|
|
258
273
|
};
|
|
259
274
|
}
|
|
260
275
|
/**
|
|
@@ -298,6 +313,7 @@ function createBillingResource(request) {
|
|
|
298
313
|
signal: options?.signal
|
|
299
314
|
});
|
|
300
315
|
},
|
|
316
|
+
/** Usage grouped by originating client (dashboard, sdk, cli, mcp, n8n, api, ...). */
|
|
301
317
|
async usageByClient(params, options) {
|
|
302
318
|
return request("/billing/usage-by-client", {
|
|
303
319
|
query: params,
|
|
@@ -441,7 +457,16 @@ async function mapLimit(items, limit, fn, signal) {
|
|
|
441
457
|
return out;
|
|
442
458
|
}
|
|
443
459
|
function createUploadsResource(request) {
|
|
444
|
-
return {
|
|
460
|
+
return {
|
|
461
|
+
/**
|
|
462
|
+
* One-call upload. Orchestrates the `/assets` flow: init → presigned PUT
|
|
463
|
+
* (small files) or parallel multipart (large files) → complete. Returns the
|
|
464
|
+
* ready Asset, whose `id` can be used as a job input reference.
|
|
465
|
+
*
|
|
466
|
+
* @param file - File content (Blob, ArrayBuffer, or Uint8Array).
|
|
467
|
+
* @param options.filename - Display filename (required).
|
|
468
|
+
*/
|
|
469
|
+
async create(file, options) {
|
|
445
470
|
const blob = toBlob(file);
|
|
446
471
|
const size = options.size ?? blob.size;
|
|
447
472
|
if (options.signal?.aborted) throw new Error("Upload aborted");
|
|
@@ -736,21 +761,23 @@ const WS_OPTIONS = {
|
|
|
736
761
|
reconnectionDelayGrowFactor: 1.5,
|
|
737
762
|
maxRetries: Infinity
|
|
738
763
|
};
|
|
739
|
-
const
|
|
764
|
+
const TERMINAL_JOB_STATUSES = /* @__PURE__ */ new Set([
|
|
740
765
|
"complete",
|
|
741
766
|
"failed",
|
|
742
767
|
"cancelled"
|
|
743
768
|
]);
|
|
744
769
|
/** Known OrgEvent types — only dispatch events with recognized types. */
|
|
745
|
-
const KNOWN_EVENT_TYPES = new Set([
|
|
770
|
+
const KNOWN_EVENT_TYPES = /* @__PURE__ */ new Set([
|
|
746
771
|
"job.created",
|
|
747
772
|
"job.status",
|
|
748
773
|
"job.result",
|
|
749
774
|
"job.progress",
|
|
750
775
|
"job.step",
|
|
751
776
|
"job.log",
|
|
777
|
+
"job.resources",
|
|
752
778
|
"job.metrics",
|
|
753
779
|
"job.context",
|
|
780
|
+
"job.region_failover",
|
|
754
781
|
"balance.updated",
|
|
755
782
|
"subscription.updated",
|
|
756
783
|
"notification",
|
|
@@ -833,15 +860,19 @@ function dispatchJobEvent(event, options) {
|
|
|
833
860
|
case "job.status": {
|
|
834
861
|
const statusEvent = event;
|
|
835
862
|
options.onStatus?.(statusEvent);
|
|
836
|
-
if (
|
|
863
|
+
if (TERMINAL_JOB_STATUSES.has(statusEvent.status)) options.onComplete?.(statusEvent);
|
|
837
864
|
break;
|
|
838
865
|
}
|
|
839
866
|
case "job.result":
|
|
840
867
|
options.onResult?.(event);
|
|
841
868
|
break;
|
|
842
|
-
case "job.
|
|
843
|
-
|
|
869
|
+
case "job.resources":
|
|
870
|
+
case "job.metrics": {
|
|
871
|
+
const e = event;
|
|
872
|
+
options.onResources?.(e);
|
|
873
|
+
options.onMetrics?.(e);
|
|
844
874
|
break;
|
|
875
|
+
}
|
|
845
876
|
case "job.context":
|
|
846
877
|
options.onContext?.(event);
|
|
847
878
|
break;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rendobar/sdk",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "TypeScript client for the Rendobar media processing API",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -34,14 +34,15 @@
|
|
|
34
34
|
"build": "tsdown",
|
|
35
35
|
"typecheck": "tsc --noEmit",
|
|
36
36
|
"test": "vitest run",
|
|
37
|
-
"test:watch": "vitest"
|
|
37
|
+
"test:watch": "vitest",
|
|
38
|
+
"test:live": "vitest run src/__tests__/live"
|
|
38
39
|
},
|
|
39
40
|
"dependencies": {
|
|
40
41
|
"partysocket": "^1.1.16"
|
|
41
42
|
},
|
|
42
43
|
"devDependencies": {
|
|
43
44
|
"@rendobar/shared": "workspace:*",
|
|
44
|
-
"tsdown": "^0.
|
|
45
|
+
"tsdown": "^0.22.0",
|
|
45
46
|
"typescript": "^5.9.3",
|
|
46
47
|
"vitest": "^4.0.18"
|
|
47
48
|
}
|