@opendatalabs/vana-sdk 3.5.0 → 3.5.1

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.
@@ -29169,6 +29169,8 @@ async function buildWeb3SignedHeader(params) {
29169
29169
  var DEFAULT_ENDPOINT = "https://storage.vana.org";
29170
29170
  var BLOB_PATH_PREFIX = "/v1/blobs";
29171
29171
  var DEFAULT_TOKEN_TTL_SECONDS = 300;
29172
+ var MAX_UPLOAD_ATTEMPTS = 4;
29173
+ var MAX_RATE_LIMIT_DELAY_MS = 3e4;
29172
29174
  var VanaStorage = class {
29173
29175
  endpoint;
29174
29176
  signer;
@@ -29207,27 +29209,46 @@ var VanaStorage = class {
29207
29209
  const body = new Uint8Array(await file.arrayBuffer());
29208
29210
  const contentType = file.type !== "" ? file.type : "application/octet-stream";
29209
29211
  const header = await this.signRequest("PUT", path, body);
29210
- let response;
29211
- try {
29212
- response = await this.fetchImpl(`${this.endpoint}${path}`, {
29213
- method: "PUT",
29214
- headers: {
29215
- authorization: header,
29216
- "content-type": contentType
29217
- },
29218
- body
29219
- });
29220
- } catch (cause) {
29212
+ let response = null;
29213
+ let responseText = "";
29214
+ for (let attempt = 1; attempt <= MAX_UPLOAD_ATTEMPTS; attempt++) {
29215
+ try {
29216
+ response = await this.fetchImpl(`${this.endpoint}${path}`, {
29217
+ method: "PUT",
29218
+ headers: {
29219
+ authorization: header,
29220
+ "content-type": contentType
29221
+ },
29222
+ body
29223
+ });
29224
+ } catch (cause) {
29225
+ throw new StorageError(
29226
+ `vana-storage upload network error: ${describe(cause)}`,
29227
+ "UPLOAD_ERROR",
29228
+ "vana-storage",
29229
+ { cause: cause instanceof Error ? cause : void 0 }
29230
+ );
29231
+ }
29232
+ if (response.ok) {
29233
+ break;
29234
+ }
29235
+ responseText = await safeText(response);
29236
+ if (response.status === 429 && attempt < MAX_UPLOAD_ATTEMPTS) {
29237
+ const delayMs = retryDelayMs(response, responseText);
29238
+ if (delayMs > 0) {
29239
+ await sleep(delayMs);
29240
+ }
29241
+ continue;
29242
+ }
29221
29243
  throw new StorageError(
29222
- `vana-storage upload network error: ${describe(cause)}`,
29223
- "UPLOAD_ERROR",
29224
- "vana-storage",
29225
- { cause: cause instanceof Error ? cause : void 0 }
29244
+ `vana-storage upload failed: ${response.status} ${response.statusText} - ${responseText}`,
29245
+ "UPLOAD_FAILED",
29246
+ "vana-storage"
29226
29247
  );
29227
29248
  }
29228
- if (!response.ok) {
29249
+ if (!response?.ok) {
29229
29250
  throw new StorageError(
29230
- `vana-storage upload failed: ${response.status} ${response.statusText} - ${await safeText(response)}`,
29251
+ `vana-storage upload failed after ${MAX_UPLOAD_ATTEMPTS} attempts - ${responseText}`,
29231
29252
  "UPLOAD_FAILED",
29232
29253
  "vana-storage"
29233
29254
  );
@@ -29380,6 +29401,43 @@ function describe(value) {
29380
29401
  if (value instanceof Error) return value.message;
29381
29402
  return String(value);
29382
29403
  }
29404
+ function retryDelayMs(response, responseText) {
29405
+ const headerDelayMs = parseRetryAfterHeaderMs(
29406
+ response.headers.get("retry-after")
29407
+ );
29408
+ if (headerDelayMs !== null) {
29409
+ return clampRateLimitDelay(headerDelayMs);
29410
+ }
29411
+ return clampRateLimitDelay(parseRetryAfterBodyMs(responseText) ?? 0);
29412
+ }
29413
+ function parseRetryAfterHeaderMs(value) {
29414
+ if (!value) return null;
29415
+ const seconds = Number(value);
29416
+ if (Number.isFinite(seconds)) {
29417
+ return seconds * 1e3;
29418
+ }
29419
+ const dateMs = Date.parse(value);
29420
+ if (Number.isFinite(dateMs)) {
29421
+ return Math.max(0, dateMs - Date.now());
29422
+ }
29423
+ return null;
29424
+ }
29425
+ function parseRetryAfterBodyMs(responseText) {
29426
+ if (!responseText) return null;
29427
+ try {
29428
+ const parsed = JSON.parse(responseText);
29429
+ const seconds = Number(parsed.retryAfter);
29430
+ return Number.isFinite(seconds) ? seconds * 1e3 : null;
29431
+ } catch {
29432
+ return null;
29433
+ }
29434
+ }
29435
+ function clampRateLimitDelay(delayMs) {
29436
+ return Math.min(Math.max(0, delayMs), MAX_RATE_LIMIT_DELAY_MS);
29437
+ }
29438
+ function sleep(ms) {
29439
+ return new Promise((resolve) => setTimeout(resolve, ms));
29440
+ }
29383
29441
  async function safeText(response) {
29384
29442
  try {
29385
29443
  return await response.text();