@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.
@@ -29009,6 +29009,8 @@ async function buildWeb3SignedHeader(params) {
29009
29009
  var DEFAULT_ENDPOINT = "https://storage.vana.org";
29010
29010
  var BLOB_PATH_PREFIX = "/v1/blobs";
29011
29011
  var DEFAULT_TOKEN_TTL_SECONDS = 300;
29012
+ var MAX_UPLOAD_ATTEMPTS = 4;
29013
+ var MAX_RATE_LIMIT_DELAY_MS = 3e4;
29012
29014
  var VanaStorage = class {
29013
29015
  endpoint;
29014
29016
  signer;
@@ -29047,27 +29049,46 @@ var VanaStorage = class {
29047
29049
  const body = new Uint8Array(await file.arrayBuffer());
29048
29050
  const contentType = file.type !== "" ? file.type : "application/octet-stream";
29049
29051
  const header = await this.signRequest("PUT", path, body);
29050
- let response;
29051
- try {
29052
- response = await this.fetchImpl(`${this.endpoint}${path}`, {
29053
- method: "PUT",
29054
- headers: {
29055
- authorization: header,
29056
- "content-type": contentType
29057
- },
29058
- body
29059
- });
29060
- } catch (cause) {
29052
+ let response = null;
29053
+ let responseText = "";
29054
+ for (let attempt = 1; attempt <= MAX_UPLOAD_ATTEMPTS; attempt++) {
29055
+ try {
29056
+ response = await this.fetchImpl(`${this.endpoint}${path}`, {
29057
+ method: "PUT",
29058
+ headers: {
29059
+ authorization: header,
29060
+ "content-type": contentType
29061
+ },
29062
+ body
29063
+ });
29064
+ } catch (cause) {
29065
+ throw new StorageError(
29066
+ `vana-storage upload network error: ${describe(cause)}`,
29067
+ "UPLOAD_ERROR",
29068
+ "vana-storage",
29069
+ { cause: cause instanceof Error ? cause : void 0 }
29070
+ );
29071
+ }
29072
+ if (response.ok) {
29073
+ break;
29074
+ }
29075
+ responseText = await safeText(response);
29076
+ if (response.status === 429 && attempt < MAX_UPLOAD_ATTEMPTS) {
29077
+ const delayMs = retryDelayMs(response, responseText);
29078
+ if (delayMs > 0) {
29079
+ await sleep(delayMs);
29080
+ }
29081
+ continue;
29082
+ }
29061
29083
  throw new StorageError(
29062
- `vana-storage upload network error: ${describe(cause)}`,
29063
- "UPLOAD_ERROR",
29064
- "vana-storage",
29065
- { cause: cause instanceof Error ? cause : void 0 }
29084
+ `vana-storage upload failed: ${response.status} ${response.statusText} - ${responseText}`,
29085
+ "UPLOAD_FAILED",
29086
+ "vana-storage"
29066
29087
  );
29067
29088
  }
29068
- if (!response.ok) {
29089
+ if (!response?.ok) {
29069
29090
  throw new StorageError(
29070
- `vana-storage upload failed: ${response.status} ${response.statusText} - ${await safeText(response)}`,
29091
+ `vana-storage upload failed after ${MAX_UPLOAD_ATTEMPTS} attempts - ${responseText}`,
29071
29092
  "UPLOAD_FAILED",
29072
29093
  "vana-storage"
29073
29094
  );
@@ -29220,6 +29241,43 @@ function describe(value) {
29220
29241
  if (value instanceof Error) return value.message;
29221
29242
  return String(value);
29222
29243
  }
29244
+ function retryDelayMs(response, responseText) {
29245
+ const headerDelayMs = parseRetryAfterHeaderMs(
29246
+ response.headers.get("retry-after")
29247
+ );
29248
+ if (headerDelayMs !== null) {
29249
+ return clampRateLimitDelay(headerDelayMs);
29250
+ }
29251
+ return clampRateLimitDelay(parseRetryAfterBodyMs(responseText) ?? 0);
29252
+ }
29253
+ function parseRetryAfterHeaderMs(value) {
29254
+ if (!value) return null;
29255
+ const seconds = Number(value);
29256
+ if (Number.isFinite(seconds)) {
29257
+ return seconds * 1e3;
29258
+ }
29259
+ const dateMs = Date.parse(value);
29260
+ if (Number.isFinite(dateMs)) {
29261
+ return Math.max(0, dateMs - Date.now());
29262
+ }
29263
+ return null;
29264
+ }
29265
+ function parseRetryAfterBodyMs(responseText) {
29266
+ if (!responseText) return null;
29267
+ try {
29268
+ const parsed = JSON.parse(responseText);
29269
+ const seconds = Number(parsed.retryAfter);
29270
+ return Number.isFinite(seconds) ? seconds * 1e3 : null;
29271
+ } catch {
29272
+ return null;
29273
+ }
29274
+ }
29275
+ function clampRateLimitDelay(delayMs) {
29276
+ return Math.min(Math.max(0, delayMs), MAX_RATE_LIMIT_DELAY_MS);
29277
+ }
29278
+ function sleep(ms) {
29279
+ return new Promise((resolve) => setTimeout(resolve, ms));
29280
+ }
29223
29281
  async function safeText(response) {
29224
29282
  try {
29225
29283
  return await response.text();