@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.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 TERMINAL_STATUSES$1 = new Set([
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
- return {
181
- async create(params, options) {
182
- return request("/jobs", {
183
- method: "POST",
184
- body: params,
185
- signal: options?.signal
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 (TERMINAL_STATUSES$1.has(job.status)) return resolveTerminal(id, job, throwOnFailure);
229
- throw new WaitTimeoutError(id, job.status, timeout);
230
- },
231
- async cancel(id, options) {
232
- return request(`/jobs/${id}/cancel`, {
233
- method: "POST",
234
- signal: options?.signal
235
- });
236
- },
237
- async download(id, options) {
238
- return request(`/jobs/${id}/download`, {
239
- raw: true,
240
- signal: options?.signal
241
- });
242
- },
243
- async logs(id, options) {
244
- return request(`/jobs/${id}/logs`, { signal: options?.signal });
245
- },
246
- async getTimings(id, options) {
247
- return request(`/jobs/${id}/timings`, { signal: options?.signal });
248
- },
249
- async types(options) {
250
- return request("/jobs/types", { signal: options?.signal });
251
- },
252
- async stats(params, options) {
253
- return request("/jobs/stats", {
254
- query: params,
255
- signal: options?.signal
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 { async create(file, options) {
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 TERMINAL_STATUSES = new Set([
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 (TERMINAL_STATUSES.has(statusEvent.status)) options.onComplete?.(statusEvent);
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.metrics":
843
- options.onMetrics?.(event);
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": "4.1.0",
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.21.7",
45
+ "tsdown": "^0.22.0",
45
46
  "typescript": "^5.9.3",
46
47
  "vitest": "^4.0.18"
47
48
  }