@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.
@@ -29018,6 +29018,8 @@ async function buildWeb3SignedHeader(params) {
29018
29018
  var DEFAULT_ENDPOINT = "https://storage.vana.org";
29019
29019
  var BLOB_PATH_PREFIX = "/v1/blobs";
29020
29020
  var DEFAULT_TOKEN_TTL_SECONDS = 300;
29021
+ var MAX_UPLOAD_ATTEMPTS = 4;
29022
+ var MAX_RATE_LIMIT_DELAY_MS = 3e4;
29021
29023
  var VanaStorage = class {
29022
29024
  endpoint;
29023
29025
  signer;
@@ -29056,27 +29058,46 @@ var VanaStorage = class {
29056
29058
  const body = new Uint8Array(await file.arrayBuffer());
29057
29059
  const contentType = file.type !== "" ? file.type : "application/octet-stream";
29058
29060
  const header = await this.signRequest("PUT", path, body);
29059
- let response;
29060
- try {
29061
- response = await this.fetchImpl(`${this.endpoint}${path}`, {
29062
- method: "PUT",
29063
- headers: {
29064
- authorization: header,
29065
- "content-type": contentType
29066
- },
29067
- body
29068
- });
29069
- } catch (cause) {
29061
+ let response = null;
29062
+ let responseText = "";
29063
+ for (let attempt = 1; attempt <= MAX_UPLOAD_ATTEMPTS; attempt++) {
29064
+ try {
29065
+ response = await this.fetchImpl(`${this.endpoint}${path}`, {
29066
+ method: "PUT",
29067
+ headers: {
29068
+ authorization: header,
29069
+ "content-type": contentType
29070
+ },
29071
+ body
29072
+ });
29073
+ } catch (cause) {
29074
+ throw new StorageError(
29075
+ `vana-storage upload network error: ${describe(cause)}`,
29076
+ "UPLOAD_ERROR",
29077
+ "vana-storage",
29078
+ { cause: cause instanceof Error ? cause : void 0 }
29079
+ );
29080
+ }
29081
+ if (response.ok) {
29082
+ break;
29083
+ }
29084
+ responseText = await safeText(response);
29085
+ if (response.status === 429 && attempt < MAX_UPLOAD_ATTEMPTS) {
29086
+ const delayMs = retryDelayMs(response, responseText);
29087
+ if (delayMs > 0) {
29088
+ await sleep(delayMs);
29089
+ }
29090
+ continue;
29091
+ }
29070
29092
  throw new StorageError(
29071
- `vana-storage upload network error: ${describe(cause)}`,
29072
- "UPLOAD_ERROR",
29073
- "vana-storage",
29074
- { cause: cause instanceof Error ? cause : void 0 }
29093
+ `vana-storage upload failed: ${response.status} ${response.statusText} - ${responseText}`,
29094
+ "UPLOAD_FAILED",
29095
+ "vana-storage"
29075
29096
  );
29076
29097
  }
29077
- if (!response.ok) {
29098
+ if (!response?.ok) {
29078
29099
  throw new StorageError(
29079
- `vana-storage upload failed: ${response.status} ${response.statusText} - ${await safeText(response)}`,
29100
+ `vana-storage upload failed after ${MAX_UPLOAD_ATTEMPTS} attempts - ${responseText}`,
29080
29101
  "UPLOAD_FAILED",
29081
29102
  "vana-storage"
29082
29103
  );
@@ -29229,6 +29250,43 @@ function describe(value) {
29229
29250
  if (value instanceof Error) return value.message;
29230
29251
  return String(value);
29231
29252
  }
29253
+ function retryDelayMs(response, responseText) {
29254
+ const headerDelayMs = parseRetryAfterHeaderMs(
29255
+ response.headers.get("retry-after")
29256
+ );
29257
+ if (headerDelayMs !== null) {
29258
+ return clampRateLimitDelay(headerDelayMs);
29259
+ }
29260
+ return clampRateLimitDelay(parseRetryAfterBodyMs(responseText) ?? 0);
29261
+ }
29262
+ function parseRetryAfterHeaderMs(value) {
29263
+ if (!value) return null;
29264
+ const seconds = Number(value);
29265
+ if (Number.isFinite(seconds)) {
29266
+ return seconds * 1e3;
29267
+ }
29268
+ const dateMs = Date.parse(value);
29269
+ if (Number.isFinite(dateMs)) {
29270
+ return Math.max(0, dateMs - Date.now());
29271
+ }
29272
+ return null;
29273
+ }
29274
+ function parseRetryAfterBodyMs(responseText) {
29275
+ if (!responseText) return null;
29276
+ try {
29277
+ const parsed = JSON.parse(responseText);
29278
+ const seconds = Number(parsed.retryAfter);
29279
+ return Number.isFinite(seconds) ? seconds * 1e3 : null;
29280
+ } catch {
29281
+ return null;
29282
+ }
29283
+ }
29284
+ function clampRateLimitDelay(delayMs) {
29285
+ return Math.min(Math.max(0, delayMs), MAX_RATE_LIMIT_DELAY_MS);
29286
+ }
29287
+ function sleep(ms) {
29288
+ return new Promise((resolve) => setTimeout(resolve, ms));
29289
+ }
29232
29290
  async function safeText(response) {
29233
29291
  try {
29234
29292
  return await response.text();