@opendatalabs/vana-sdk 3.11.0 → 3.13.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/README.md +28 -1
- package/dist/index.browser.js +44 -7
- package/dist/index.browser.js.map +2 -2
- package/dist/index.node.cjs +44 -7
- package/dist/index.node.cjs.map +2 -2
- package/dist/index.node.js +44 -7
- package/dist/index.node.js.map +2 -2
- package/dist/storage/providers/vana-storage.cjs +44 -7
- package/dist/storage/providers/vana-storage.cjs.map +1 -1
- package/dist/storage/providers/vana-storage.d.ts +24 -0
- package/dist/storage/providers/vana-storage.js +44 -7
- package/dist/storage/providers/vana-storage.js.map +1 -1
- package/package.json +1 -1
package/dist/index.node.js
CHANGED
|
@@ -29037,12 +29037,14 @@ async function buildWeb3SignedHeader(params) {
|
|
|
29037
29037
|
|
|
29038
29038
|
// src/storage/providers/vana-storage.ts
|
|
29039
29039
|
var DEFAULT_ENDPOINT = "https://storage.vana.org";
|
|
29040
|
-
var
|
|
29040
|
+
var LEGACY_BLOB_PATH_PREFIX = "/v1/blobs";
|
|
29041
29041
|
var DEFAULT_TOKEN_TTL_SECONDS = 300;
|
|
29042
29042
|
var MAX_UPLOAD_ATTEMPTS = 4;
|
|
29043
29043
|
var MAX_RATE_LIMIT_DELAY_MS = 3e4;
|
|
29044
29044
|
var VanaStorage = class {
|
|
29045
29045
|
endpoint;
|
|
29046
|
+
chainId;
|
|
29047
|
+
blobPathPrefix;
|
|
29046
29048
|
signer;
|
|
29047
29049
|
ownerAddress;
|
|
29048
29050
|
fetchImpl;
|
|
@@ -29055,6 +29057,15 @@ var VanaStorage = class {
|
|
|
29055
29057
|
);
|
|
29056
29058
|
}
|
|
29057
29059
|
this.endpoint = (config.endpoint ?? DEFAULT_ENDPOINT).replace(/\/+$/, "");
|
|
29060
|
+
if (config.chainId !== void 0 && !isValidChainId(config.chainId)) {
|
|
29061
|
+
throw new StorageError(
|
|
29062
|
+
`Unsupported vana-storage chainId '${String(config.chainId)}'`,
|
|
29063
|
+
"INVALID_CHAIN_ID",
|
|
29064
|
+
"vana-storage"
|
|
29065
|
+
);
|
|
29066
|
+
}
|
|
29067
|
+
this.chainId = config.chainId;
|
|
29068
|
+
this.blobPathPrefix = this.chainId !== void 0 ? `/v1/chains/${this.chainId}/blobs` : LEGACY_BLOB_PATH_PREFIX;
|
|
29058
29069
|
this.signer = config.signer;
|
|
29059
29070
|
this.ownerAddress = (config.ownerAddress ?? config.signer.address).toLowerCase();
|
|
29060
29071
|
this.fetchImpl = config.fetchImpl ?? globalThis.fetch.bind(globalThis);
|
|
@@ -29075,7 +29086,7 @@ var VanaStorage = class {
|
|
|
29075
29086
|
);
|
|
29076
29087
|
}
|
|
29077
29088
|
const subpath = encodeRelativePath(filename);
|
|
29078
|
-
const path = `${
|
|
29089
|
+
const path = `${this.blobPathPrefix}/${this.ownerAddress}/${subpath}`;
|
|
29079
29090
|
const body = new Uint8Array(await file.arrayBuffer());
|
|
29080
29091
|
const contentType = file.type !== "" ? file.type : "application/octet-stream";
|
|
29081
29092
|
const header = await this.signRequest("PUT", path, body);
|
|
@@ -29243,12 +29254,17 @@ var VanaStorage = class {
|
|
|
29243
29254
|
"vana-storage"
|
|
29244
29255
|
);
|
|
29245
29256
|
}
|
|
29246
|
-
const
|
|
29247
|
-
|
|
29248
|
-
|
|
29249
|
-
|
|
29257
|
+
const route = parseBlobPath(parsed.pathname);
|
|
29258
|
+
if (!route || route.owner.toLowerCase() !== this.ownerAddress) {
|
|
29259
|
+
throw new StorageError(
|
|
29260
|
+
`URL path '${parsed.pathname}' must be ${this.blobPathPrefix}/${this.ownerAddress}/{scope}/{collectedAt}`,
|
|
29261
|
+
"INVALID_URL",
|
|
29262
|
+
"vana-storage"
|
|
29263
|
+
);
|
|
29264
|
+
}
|
|
29265
|
+
if (route.chainId !== this.chainId) {
|
|
29250
29266
|
throw new StorageError(
|
|
29251
|
-
`URL
|
|
29267
|
+
`URL chainId '${route.chainId ?? "legacy"}' does not match provider chainId '${this.chainId ?? "legacy"}'`,
|
|
29252
29268
|
"INVALID_URL",
|
|
29253
29269
|
"vana-storage"
|
|
29254
29270
|
);
|
|
@@ -29256,6 +29272,27 @@ var VanaStorage = class {
|
|
|
29256
29272
|
return parsed.pathname;
|
|
29257
29273
|
}
|
|
29258
29274
|
};
|
|
29275
|
+
function isValidChainId(value) {
|
|
29276
|
+
return typeof value === "number" && Number.isInteger(value) && value > 0;
|
|
29277
|
+
}
|
|
29278
|
+
function parseBlobPath(pathname) {
|
|
29279
|
+
const segments = pathname.split("/").filter((s) => s.length > 0);
|
|
29280
|
+
const isTraversal = (s) => s === "." || s === "..";
|
|
29281
|
+
if (segments.length === 5 && segments[0] === "v1" && segments[1] === "blobs") {
|
|
29282
|
+
const [, , owner, scope, collectedAt] = segments;
|
|
29283
|
+
if (isTraversal(scope) || isTraversal(collectedAt)) return null;
|
|
29284
|
+
return { owner, scope, collectedAt };
|
|
29285
|
+
}
|
|
29286
|
+
if (segments.length === 7 && segments[0] === "v1" && segments[1] === "chains" && segments[3] === "blobs") {
|
|
29287
|
+
const [, , chainIdSegment, , owner, scope, collectedAt] = segments;
|
|
29288
|
+
if (!/^[0-9]+$/.test(chainIdSegment)) return null;
|
|
29289
|
+
const chainId = Number(chainIdSegment);
|
|
29290
|
+
if (!isValidChainId(chainId)) return null;
|
|
29291
|
+
if (isTraversal(scope) || isTraversal(collectedAt)) return null;
|
|
29292
|
+
return { chainId, owner, scope, collectedAt };
|
|
29293
|
+
}
|
|
29294
|
+
return null;
|
|
29295
|
+
}
|
|
29259
29296
|
function encodeRelativePath(filename) {
|
|
29260
29297
|
const parts = filename.split("/");
|
|
29261
29298
|
if (parts.length !== 2 || parts.some((p) => p.length === 0 || p === "." || p === "..")) {
|