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