@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.
- package/dist/index.browser.js +75 -17
- package/dist/index.browser.js.map +2 -2
- package/dist/index.node.cjs +75 -17
- package/dist/index.node.cjs.map +2 -2
- package/dist/index.node.js +75 -17
- package/dist/index.node.js.map +2 -2
- package/dist/storage/providers/vana-storage.cjs +75 -17
- package/dist/storage/providers/vana-storage.cjs.map +1 -1
- package/dist/storage/providers/vana-storage.js +75 -17
- package/dist/storage/providers/vana-storage.js.map +1 -1
- package/package.json +1 -1
package/dist/index.browser.js
CHANGED
|
@@ -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
|
-
|
|
29052
|
-
|
|
29053
|
-
|
|
29054
|
-
|
|
29055
|
-
|
|
29056
|
-
|
|
29057
|
-
|
|
29058
|
-
|
|
29059
|
-
|
|
29060
|
-
|
|
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
|
|
29063
|
-
"
|
|
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
|
|
29089
|
+
if (!response?.ok) {
|
|
29069
29090
|
throw new StorageError(
|
|
29070
|
-
`vana-storage upload failed
|
|
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();
|