@medialane/sdk 0.88.0 → 0.90.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/dist/index.cjs +123 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +32 -1
- package/dist/index.d.ts +32 -1
- package/dist/index.js +115 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -426,6 +426,37 @@ interface BackendProxyConfig {
|
|
|
426
426
|
}
|
|
427
427
|
declare function createBackendProxyHandler(config: BackendProxyConfig): (req: Request) => Promise<Response>;
|
|
428
428
|
|
|
429
|
+
declare const ALLOWED_IMAGE_CONTENT_TYPES: Set<string>;
|
|
430
|
+
declare const MAX_IMAGE_REDIRECTS = 5;
|
|
431
|
+
declare const MAX_IMAGE_PROXY_BYTES: number;
|
|
432
|
+
declare function isPrivateHost(hostname: string): boolean;
|
|
433
|
+
declare function validateUrl(raw: string): {
|
|
434
|
+
url: URL;
|
|
435
|
+
} | {
|
|
436
|
+
error: string;
|
|
437
|
+
status: number;
|
|
438
|
+
};
|
|
439
|
+
|
|
440
|
+
interface BackendMetadataConfig {
|
|
441
|
+
backendUrl: string;
|
|
442
|
+
apiKey: string;
|
|
443
|
+
fetchImpl?: typeof fetch;
|
|
444
|
+
}
|
|
445
|
+
interface BackendUploadResult {
|
|
446
|
+
cid: string;
|
|
447
|
+
uri: string;
|
|
448
|
+
}
|
|
449
|
+
declare function uploadJsonToBackend(config: BackendMetadataConfig, json: unknown): Promise<BackendUploadResult>;
|
|
450
|
+
declare function uploadFileToBackend(config: BackendMetadataConfig, file: File): Promise<BackendUploadResult>;
|
|
451
|
+
declare function uploadDirectoryToBackend(config: BackendMetadataConfig, files: {
|
|
452
|
+
name: string;
|
|
453
|
+
content: unknown;
|
|
454
|
+
}[]): Promise<{
|
|
455
|
+
cid: string;
|
|
456
|
+
baseUri: string;
|
|
457
|
+
}>;
|
|
458
|
+
declare function getBackendSignedUrl(config: BackendMetadataConfig, kind?: "image" | "document" | "media"): Promise<string>;
|
|
459
|
+
|
|
429
460
|
declare function createRateLimiter(windowMs: number, max: number): (key: string) => boolean;
|
|
430
461
|
declare function requestIp(req: Request): string;
|
|
431
462
|
|
|
@@ -487,4 +518,4 @@ declare const IPFS_SAFE_CONTENT_TYPE_PREFIXES: readonly ["image/jpeg", "image/pn
|
|
|
487
518
|
declare function resolveSafeImageContentType(contentType: string): string;
|
|
488
519
|
declare const MAX_IPFS_GATEWAY_RESPONSE_BYTES: number;
|
|
489
520
|
|
|
490
|
-
export { type AssetAttribute, type AssetMetadata, type BackendProxyConfig, type BuildAssetMetadataInput, Chain, DEFAULT_CURRENCY, type FailoverFetchOptions, type FeeEnv, IPFS_SAFE_CONTENT_TYPE_PREFIXES, MAX_IPFS_GATEWAY_RESPONSE_BYTES, PUBLIC_RPC_FALLBACKS, RESERVED_TRAITS, type RemixPolicy, type RemixPolicyInput, ResolvedFeeConfig, type RpcProxyConfig, STARKNET_COLLECTION_1155_CLASS_HASH, STARKNET_COLLECTION_1155_CONTRACT, STARKNET_COLLECTION_1155_FACTORY_CLASS_HASH, STARKNET_COLLECTION_1155_START_BLOCK, STARKNET_COLLECTION_721_CONTRACT, STARKNET_COLLECTION_721_START_BLOCK, STARKNET_CREATOR_COIN_CLASS_HASH, STARKNET_CREATOR_COIN_EKUBO_LAUNCHER, STARKNET_CREATOR_COIN_FACTORY_CLASS_HASH, STARKNET_CREATOR_COIN_FACTORY_CONTRACT, STARKNET_CREATOR_COIN_START_BLOCK, STARKNET_DROP_COLLECTION_CLASS_HASH, STARKNET_DROP_FACTORY_CONTRACT, STARKNET_EKUBO_CORE, STARKNET_IPCOLLECTION_CLASS_HASH, STARKNET_IPNFT_CLASS_HASH, STARKNET_IP_CLUB_COLLECTION_CLASS_HASH, STARKNET_IP_CLUB_FACTORY_CONTRACT, STARKNET_IP_SPONSORSHIP_CLASS_HASH, STARKNET_IP_SPONSORSHIP_CONTRACT, STARKNET_IP_TICKETS_FACTORY_CONTRACT, STARKNET_IP_TICKET_COLLECTION_CLASS_HASH, STARKNET_MARKETPLACE_1155_CLASS_HASH, STARKNET_MARKETPLACE_1155_CONTRACT, STARKNET_MARKETPLACE_1155_START_BLOCK, STARKNET_MARKETPLACE_721_CLASS_HASH, STARKNET_MARKETPLACE_721_CONTRACT, STARKNET_MARKETPLACE_721_START_BLOCK, STARKNET_NFTCOMMENTS_CONTRACT, STARKNET_POP_COLLECTION_CLASS_HASH, STARKNET_POP_FACTORY_CONTRACT, SUPPORTED_TOKENS, SUPPORTED_URL_CHAINS, ServiceCapability, ServiceDefinition, type ServiceId, type SupportedToken, type SupportedTokenSymbol, assetHref, buildAssetMetadata, chainFromSlug, chainSlug, coinHref, collectionHref, createBackendProxyHandler, createFailoverFetch, createRateLimiter, createRpcProxyHandler, encodeU256, formatAmount, getDerivativesTerm, getListableTokens, getService, getServicesByCapability, getTokenByAddress, getTokenBySymbol, hasCapability, isSameOrigin, isServiceId, isTransientRpcError, isValidIpfsCidPath, listServices, normalizeAddress, normalizeHash, parseAmount, requestIp, resolveAppFeeConfig, resolveRemixPolicy, resolveSafeImageContentType, shortenAddress, stringifyBigInts, u256ToBigInt };
|
|
521
|
+
export { ALLOWED_IMAGE_CONTENT_TYPES, type AssetAttribute, type AssetMetadata, type BackendMetadataConfig, type BackendProxyConfig, type BackendUploadResult, type BuildAssetMetadataInput, Chain, DEFAULT_CURRENCY, type FailoverFetchOptions, type FeeEnv, IPFS_SAFE_CONTENT_TYPE_PREFIXES, MAX_IMAGE_PROXY_BYTES, MAX_IMAGE_REDIRECTS, MAX_IPFS_GATEWAY_RESPONSE_BYTES, PUBLIC_RPC_FALLBACKS, RESERVED_TRAITS, type RemixPolicy, type RemixPolicyInput, ResolvedFeeConfig, type RpcProxyConfig, STARKNET_COLLECTION_1155_CLASS_HASH, STARKNET_COLLECTION_1155_CONTRACT, STARKNET_COLLECTION_1155_FACTORY_CLASS_HASH, STARKNET_COLLECTION_1155_START_BLOCK, STARKNET_COLLECTION_721_CONTRACT, STARKNET_COLLECTION_721_START_BLOCK, STARKNET_CREATOR_COIN_CLASS_HASH, STARKNET_CREATOR_COIN_EKUBO_LAUNCHER, STARKNET_CREATOR_COIN_FACTORY_CLASS_HASH, STARKNET_CREATOR_COIN_FACTORY_CONTRACT, STARKNET_CREATOR_COIN_START_BLOCK, STARKNET_DROP_COLLECTION_CLASS_HASH, STARKNET_DROP_FACTORY_CONTRACT, STARKNET_EKUBO_CORE, STARKNET_IPCOLLECTION_CLASS_HASH, STARKNET_IPNFT_CLASS_HASH, STARKNET_IP_CLUB_COLLECTION_CLASS_HASH, STARKNET_IP_CLUB_FACTORY_CONTRACT, STARKNET_IP_SPONSORSHIP_CLASS_HASH, STARKNET_IP_SPONSORSHIP_CONTRACT, STARKNET_IP_TICKETS_FACTORY_CONTRACT, STARKNET_IP_TICKET_COLLECTION_CLASS_HASH, STARKNET_MARKETPLACE_1155_CLASS_HASH, STARKNET_MARKETPLACE_1155_CONTRACT, STARKNET_MARKETPLACE_1155_START_BLOCK, STARKNET_MARKETPLACE_721_CLASS_HASH, STARKNET_MARKETPLACE_721_CONTRACT, STARKNET_MARKETPLACE_721_START_BLOCK, STARKNET_NFTCOMMENTS_CONTRACT, STARKNET_POP_COLLECTION_CLASS_HASH, STARKNET_POP_FACTORY_CONTRACT, SUPPORTED_TOKENS, SUPPORTED_URL_CHAINS, ServiceCapability, ServiceDefinition, type ServiceId, type SupportedToken, type SupportedTokenSymbol, assetHref, buildAssetMetadata, chainFromSlug, chainSlug, coinHref, collectionHref, createBackendProxyHandler, createFailoverFetch, createRateLimiter, createRpcProxyHandler, encodeU256, formatAmount, getBackendSignedUrl, getDerivativesTerm, getListableTokens, getService, getServicesByCapability, getTokenByAddress, getTokenBySymbol, hasCapability, isPrivateHost, isSameOrigin, isServiceId, isTransientRpcError, isValidIpfsCidPath, listServices, normalizeAddress, normalizeHash, parseAmount, requestIp, resolveAppFeeConfig, resolveRemixPolicy, resolveSafeImageContentType, shortenAddress, stringifyBigInts, u256ToBigInt, uploadDirectoryToBackend, uploadFileToBackend, uploadJsonToBackend, validateUrl };
|
package/dist/index.d.ts
CHANGED
|
@@ -426,6 +426,37 @@ interface BackendProxyConfig {
|
|
|
426
426
|
}
|
|
427
427
|
declare function createBackendProxyHandler(config: BackendProxyConfig): (req: Request) => Promise<Response>;
|
|
428
428
|
|
|
429
|
+
declare const ALLOWED_IMAGE_CONTENT_TYPES: Set<string>;
|
|
430
|
+
declare const MAX_IMAGE_REDIRECTS = 5;
|
|
431
|
+
declare const MAX_IMAGE_PROXY_BYTES: number;
|
|
432
|
+
declare function isPrivateHost(hostname: string): boolean;
|
|
433
|
+
declare function validateUrl(raw: string): {
|
|
434
|
+
url: URL;
|
|
435
|
+
} | {
|
|
436
|
+
error: string;
|
|
437
|
+
status: number;
|
|
438
|
+
};
|
|
439
|
+
|
|
440
|
+
interface BackendMetadataConfig {
|
|
441
|
+
backendUrl: string;
|
|
442
|
+
apiKey: string;
|
|
443
|
+
fetchImpl?: typeof fetch;
|
|
444
|
+
}
|
|
445
|
+
interface BackendUploadResult {
|
|
446
|
+
cid: string;
|
|
447
|
+
uri: string;
|
|
448
|
+
}
|
|
449
|
+
declare function uploadJsonToBackend(config: BackendMetadataConfig, json: unknown): Promise<BackendUploadResult>;
|
|
450
|
+
declare function uploadFileToBackend(config: BackendMetadataConfig, file: File): Promise<BackendUploadResult>;
|
|
451
|
+
declare function uploadDirectoryToBackend(config: BackendMetadataConfig, files: {
|
|
452
|
+
name: string;
|
|
453
|
+
content: unknown;
|
|
454
|
+
}[]): Promise<{
|
|
455
|
+
cid: string;
|
|
456
|
+
baseUri: string;
|
|
457
|
+
}>;
|
|
458
|
+
declare function getBackendSignedUrl(config: BackendMetadataConfig, kind?: "image" | "document" | "media"): Promise<string>;
|
|
459
|
+
|
|
429
460
|
declare function createRateLimiter(windowMs: number, max: number): (key: string) => boolean;
|
|
430
461
|
declare function requestIp(req: Request): string;
|
|
431
462
|
|
|
@@ -487,4 +518,4 @@ declare const IPFS_SAFE_CONTENT_TYPE_PREFIXES: readonly ["image/jpeg", "image/pn
|
|
|
487
518
|
declare function resolveSafeImageContentType(contentType: string): string;
|
|
488
519
|
declare const MAX_IPFS_GATEWAY_RESPONSE_BYTES: number;
|
|
489
520
|
|
|
490
|
-
export { type AssetAttribute, type AssetMetadata, type BackendProxyConfig, type BuildAssetMetadataInput, Chain, DEFAULT_CURRENCY, type FailoverFetchOptions, type FeeEnv, IPFS_SAFE_CONTENT_TYPE_PREFIXES, MAX_IPFS_GATEWAY_RESPONSE_BYTES, PUBLIC_RPC_FALLBACKS, RESERVED_TRAITS, type RemixPolicy, type RemixPolicyInput, ResolvedFeeConfig, type RpcProxyConfig, STARKNET_COLLECTION_1155_CLASS_HASH, STARKNET_COLLECTION_1155_CONTRACT, STARKNET_COLLECTION_1155_FACTORY_CLASS_HASH, STARKNET_COLLECTION_1155_START_BLOCK, STARKNET_COLLECTION_721_CONTRACT, STARKNET_COLLECTION_721_START_BLOCK, STARKNET_CREATOR_COIN_CLASS_HASH, STARKNET_CREATOR_COIN_EKUBO_LAUNCHER, STARKNET_CREATOR_COIN_FACTORY_CLASS_HASH, STARKNET_CREATOR_COIN_FACTORY_CONTRACT, STARKNET_CREATOR_COIN_START_BLOCK, STARKNET_DROP_COLLECTION_CLASS_HASH, STARKNET_DROP_FACTORY_CONTRACT, STARKNET_EKUBO_CORE, STARKNET_IPCOLLECTION_CLASS_HASH, STARKNET_IPNFT_CLASS_HASH, STARKNET_IP_CLUB_COLLECTION_CLASS_HASH, STARKNET_IP_CLUB_FACTORY_CONTRACT, STARKNET_IP_SPONSORSHIP_CLASS_HASH, STARKNET_IP_SPONSORSHIP_CONTRACT, STARKNET_IP_TICKETS_FACTORY_CONTRACT, STARKNET_IP_TICKET_COLLECTION_CLASS_HASH, STARKNET_MARKETPLACE_1155_CLASS_HASH, STARKNET_MARKETPLACE_1155_CONTRACT, STARKNET_MARKETPLACE_1155_START_BLOCK, STARKNET_MARKETPLACE_721_CLASS_HASH, STARKNET_MARKETPLACE_721_CONTRACT, STARKNET_MARKETPLACE_721_START_BLOCK, STARKNET_NFTCOMMENTS_CONTRACT, STARKNET_POP_COLLECTION_CLASS_HASH, STARKNET_POP_FACTORY_CONTRACT, SUPPORTED_TOKENS, SUPPORTED_URL_CHAINS, ServiceCapability, ServiceDefinition, type ServiceId, type SupportedToken, type SupportedTokenSymbol, assetHref, buildAssetMetadata, chainFromSlug, chainSlug, coinHref, collectionHref, createBackendProxyHandler, createFailoverFetch, createRateLimiter, createRpcProxyHandler, encodeU256, formatAmount, getDerivativesTerm, getListableTokens, getService, getServicesByCapability, getTokenByAddress, getTokenBySymbol, hasCapability, isSameOrigin, isServiceId, isTransientRpcError, isValidIpfsCidPath, listServices, normalizeAddress, normalizeHash, parseAmount, requestIp, resolveAppFeeConfig, resolveRemixPolicy, resolveSafeImageContentType, shortenAddress, stringifyBigInts, u256ToBigInt };
|
|
521
|
+
export { ALLOWED_IMAGE_CONTENT_TYPES, type AssetAttribute, type AssetMetadata, type BackendMetadataConfig, type BackendProxyConfig, type BackendUploadResult, type BuildAssetMetadataInput, Chain, DEFAULT_CURRENCY, type FailoverFetchOptions, type FeeEnv, IPFS_SAFE_CONTENT_TYPE_PREFIXES, MAX_IMAGE_PROXY_BYTES, MAX_IMAGE_REDIRECTS, MAX_IPFS_GATEWAY_RESPONSE_BYTES, PUBLIC_RPC_FALLBACKS, RESERVED_TRAITS, type RemixPolicy, type RemixPolicyInput, ResolvedFeeConfig, type RpcProxyConfig, STARKNET_COLLECTION_1155_CLASS_HASH, STARKNET_COLLECTION_1155_CONTRACT, STARKNET_COLLECTION_1155_FACTORY_CLASS_HASH, STARKNET_COLLECTION_1155_START_BLOCK, STARKNET_COLLECTION_721_CONTRACT, STARKNET_COLLECTION_721_START_BLOCK, STARKNET_CREATOR_COIN_CLASS_HASH, STARKNET_CREATOR_COIN_EKUBO_LAUNCHER, STARKNET_CREATOR_COIN_FACTORY_CLASS_HASH, STARKNET_CREATOR_COIN_FACTORY_CONTRACT, STARKNET_CREATOR_COIN_START_BLOCK, STARKNET_DROP_COLLECTION_CLASS_HASH, STARKNET_DROP_FACTORY_CONTRACT, STARKNET_EKUBO_CORE, STARKNET_IPCOLLECTION_CLASS_HASH, STARKNET_IPNFT_CLASS_HASH, STARKNET_IP_CLUB_COLLECTION_CLASS_HASH, STARKNET_IP_CLUB_FACTORY_CONTRACT, STARKNET_IP_SPONSORSHIP_CLASS_HASH, STARKNET_IP_SPONSORSHIP_CONTRACT, STARKNET_IP_TICKETS_FACTORY_CONTRACT, STARKNET_IP_TICKET_COLLECTION_CLASS_HASH, STARKNET_MARKETPLACE_1155_CLASS_HASH, STARKNET_MARKETPLACE_1155_CONTRACT, STARKNET_MARKETPLACE_1155_START_BLOCK, STARKNET_MARKETPLACE_721_CLASS_HASH, STARKNET_MARKETPLACE_721_CONTRACT, STARKNET_MARKETPLACE_721_START_BLOCK, STARKNET_NFTCOMMENTS_CONTRACT, STARKNET_POP_COLLECTION_CLASS_HASH, STARKNET_POP_FACTORY_CONTRACT, SUPPORTED_TOKENS, SUPPORTED_URL_CHAINS, ServiceCapability, ServiceDefinition, type ServiceId, type SupportedToken, type SupportedTokenSymbol, assetHref, buildAssetMetadata, chainFromSlug, chainSlug, coinHref, collectionHref, createBackendProxyHandler, createFailoverFetch, createRateLimiter, createRpcProxyHandler, encodeU256, formatAmount, getBackendSignedUrl, getDerivativesTerm, getListableTokens, getService, getServicesByCapability, getTokenByAddress, getTokenBySymbol, hasCapability, isPrivateHost, isSameOrigin, isServiceId, isTransientRpcError, isValidIpfsCidPath, listServices, normalizeAddress, normalizeHash, parseAmount, requestIp, resolveAppFeeConfig, resolveRemixPolicy, resolveSafeImageContentType, shortenAddress, stringifyBigInts, u256ToBigInt, uploadDirectoryToBackend, uploadFileToBackend, uploadJsonToBackend, validateUrl };
|
package/dist/index.js
CHANGED
|
@@ -294,15 +294,15 @@ var ApiClient = class {
|
|
|
294
294
|
}
|
|
295
295
|
async request(path, init, opts) {
|
|
296
296
|
const url = `${this.baseUrl.replace(/\/$/, "")}${path}`;
|
|
297
|
-
const
|
|
297
|
+
const headers2 = { ...this.baseHeaders };
|
|
298
298
|
if (!(init?.body instanceof FormData)) {
|
|
299
|
-
|
|
299
|
+
headers2["Content-Type"] = "application/json";
|
|
300
300
|
}
|
|
301
301
|
const allowed = (status) => opts?.allow404 === true && status === 404 || opts?.allow403 === true && status === 403;
|
|
302
302
|
const res = await withRetry(async () => {
|
|
303
303
|
const response = await fetch(url, {
|
|
304
304
|
...init,
|
|
305
|
-
headers: { ...
|
|
305
|
+
headers: { ...headers2, ...init?.headers }
|
|
306
306
|
});
|
|
307
307
|
if (!response.ok && !allowed(response.status)) {
|
|
308
308
|
const text = await response.text().catch(() => response.statusText);
|
|
@@ -1340,7 +1340,7 @@ function proxyError(code, message, status) {
|
|
|
1340
1340
|
}
|
|
1341
1341
|
function createBackendProxyHandler(config) {
|
|
1342
1342
|
const doFetch = config.fetchImpl ?? fetch;
|
|
1343
|
-
const
|
|
1343
|
+
const endpoint2 = `${config.backendUrl.replace(/\/$/, "")}/${config.path.replace(/^\//, "")}`;
|
|
1344
1344
|
return async function handleBackendProxy(req) {
|
|
1345
1345
|
if (!isSameOrigin(req)) {
|
|
1346
1346
|
return proxyError(-32600, "Cross-origin requests are not allowed", 403);
|
|
@@ -1358,7 +1358,7 @@ function createBackendProxyHandler(config) {
|
|
|
1358
1358
|
return proxyError(-32700, "Parse error", 400);
|
|
1359
1359
|
}
|
|
1360
1360
|
try {
|
|
1361
|
-
const upstream = await doFetch(
|
|
1361
|
+
const upstream = await doFetch(endpoint2, {
|
|
1362
1362
|
method: "POST",
|
|
1363
1363
|
headers: { "Content-Type": "application/json", "x-api-key": config.apiKey },
|
|
1364
1364
|
body: JSON.stringify(body)
|
|
@@ -1379,6 +1379,115 @@ function createRpcProxyHandler(config) {
|
|
|
1379
1379
|
return createBackendProxyHandler({ ...config, path: "/v1/rpc" });
|
|
1380
1380
|
}
|
|
1381
1381
|
|
|
1382
|
+
// src/server/ssrf-guard.ts
|
|
1383
|
+
var ALLOWED_IMAGE_CONTENT_TYPES = /* @__PURE__ */ new Set([
|
|
1384
|
+
"image/jpeg",
|
|
1385
|
+
"image/jpg",
|
|
1386
|
+
"image/png",
|
|
1387
|
+
"image/gif",
|
|
1388
|
+
"image/webp",
|
|
1389
|
+
"image/svg+xml",
|
|
1390
|
+
"image/avif",
|
|
1391
|
+
"image/bmp",
|
|
1392
|
+
"image/tiff"
|
|
1393
|
+
]);
|
|
1394
|
+
var MAX_IMAGE_REDIRECTS = 5;
|
|
1395
|
+
var MAX_IMAGE_PROXY_BYTES = 15 * 1024 * 1024;
|
|
1396
|
+
function isPrivateHost(hostname) {
|
|
1397
|
+
const h = hostname.toLowerCase().replace(/^\[|\]$/g, "");
|
|
1398
|
+
if (h === "localhost" || h === "127.0.0.1" || h === "0.0.0.0") return true;
|
|
1399
|
+
if (/^\d+$/.test(h)) {
|
|
1400
|
+
const n = parseInt(h, 10);
|
|
1401
|
+
if (n === 2130706433 || n === 0 || n >= 2886729728 && n <= 2887778303 || n >= 3232235520 && n <= 3232301055 || n >= 167772160 && n <= 184549375 || n >= 2851995648 && n <= 2852061183) return true;
|
|
1402
|
+
}
|
|
1403
|
+
if (/^0x[0-9a-f]+$/i.test(h)) {
|
|
1404
|
+
const n = parseInt(h, 16);
|
|
1405
|
+
if (n === 2130706433 || n === 0 || n >= 2886729728 && n <= 2887778303 || n >= 3232235520 && n <= 3232301055 || n >= 167772160 && n <= 184549375 || n >= 2851995648 && n <= 2852061183) return true;
|
|
1406
|
+
}
|
|
1407
|
+
if (/^0\d+\.\d+\.\d+\.\d+$/.test(h)) return true;
|
|
1408
|
+
if (h === "::1" || /^0*:0*:0*:0*:0*:0*:0*:0*1$/.test(h)) return true;
|
|
1409
|
+
const v4mapped = h.match(/^::ffff:(\d+\.\d+\.\d+\.\d+)$/i);
|
|
1410
|
+
if (v4mapped) return isPrivateHost(v4mapped[1]);
|
|
1411
|
+
if (/^10\./.test(h)) return true;
|
|
1412
|
+
if (/^172\.(1[6-9]|2\d|3[01])\./.test(h)) return true;
|
|
1413
|
+
if (/^192\.168\./.test(h)) return true;
|
|
1414
|
+
if (/^169\.254\./.test(h)) return true;
|
|
1415
|
+
if (/^100\.(6[4-9]|[7-9]\d|1[01]\d|12[0-7])\./.test(h)) return true;
|
|
1416
|
+
if (/^fe80:/i.test(h)) return true;
|
|
1417
|
+
if (/^f[cd][0-9a-f]{2}:/i.test(h)) return true;
|
|
1418
|
+
if (h.endsWith(".local")) return true;
|
|
1419
|
+
if (h === "metadata.google.internal") return true;
|
|
1420
|
+
if (h === "metadata.azure.internal") return true;
|
|
1421
|
+
return false;
|
|
1422
|
+
}
|
|
1423
|
+
function validateUrl(raw) {
|
|
1424
|
+
let parsed;
|
|
1425
|
+
try {
|
|
1426
|
+
parsed = new URL(raw);
|
|
1427
|
+
} catch {
|
|
1428
|
+
return { error: "Invalid url", status: 400 };
|
|
1429
|
+
}
|
|
1430
|
+
if (parsed.protocol !== "https:") {
|
|
1431
|
+
return { error: "Only https URLs allowed", status: 400 };
|
|
1432
|
+
}
|
|
1433
|
+
if (parsed.username || parsed.password) {
|
|
1434
|
+
return { error: "URL credentials not allowed", status: 400 };
|
|
1435
|
+
}
|
|
1436
|
+
if (isPrivateHost(parsed.hostname)) {
|
|
1437
|
+
return { error: "URL not allowed", status: 400 };
|
|
1438
|
+
}
|
|
1439
|
+
return { url: parsed };
|
|
1440
|
+
}
|
|
1441
|
+
|
|
1442
|
+
// src/server/backend-metadata.ts
|
|
1443
|
+
function endpoint(config, path) {
|
|
1444
|
+
return `${config.backendUrl.replace(/\/$/, "")}/v1/metadata/${path}`;
|
|
1445
|
+
}
|
|
1446
|
+
function headers(config, extra) {
|
|
1447
|
+
return { "x-api-key": config.apiKey, ...extra };
|
|
1448
|
+
}
|
|
1449
|
+
async function uploadJsonToBackend(config, json) {
|
|
1450
|
+
const res = await (config.fetchImpl ?? fetch)(endpoint(config, "upload"), {
|
|
1451
|
+
method: "POST",
|
|
1452
|
+
headers: headers(config, { "Content-Type": "application/json" }),
|
|
1453
|
+
body: JSON.stringify(json)
|
|
1454
|
+
});
|
|
1455
|
+
const data = await res.json().catch(() => ({}));
|
|
1456
|
+
if (!res.ok || !data.data) throw new Error(data.error ?? "Metadata upload failed");
|
|
1457
|
+
return { cid: data.data.cid, uri: data.data.url };
|
|
1458
|
+
}
|
|
1459
|
+
async function uploadFileToBackend(config, file) {
|
|
1460
|
+
const form = new FormData();
|
|
1461
|
+
form.append("file", file, file.name);
|
|
1462
|
+
const res = await (config.fetchImpl ?? fetch)(endpoint(config, "upload-file"), {
|
|
1463
|
+
method: "POST",
|
|
1464
|
+
headers: headers(config),
|
|
1465
|
+
body: form
|
|
1466
|
+
});
|
|
1467
|
+
const data = await res.json().catch(() => ({}));
|
|
1468
|
+
if (!res.ok || !data.data) throw new Error(data.error ?? "File upload failed");
|
|
1469
|
+
return { cid: data.data.cid, uri: data.data.url };
|
|
1470
|
+
}
|
|
1471
|
+
async function uploadDirectoryToBackend(config, files) {
|
|
1472
|
+
const res = await (config.fetchImpl ?? fetch)(endpoint(config, "upload-directory"), {
|
|
1473
|
+
method: "POST",
|
|
1474
|
+
headers: headers(config, { "Content-Type": "application/json" }),
|
|
1475
|
+
body: JSON.stringify({ files })
|
|
1476
|
+
});
|
|
1477
|
+
const data = await res.json().catch(() => ({}));
|
|
1478
|
+
if (!res.ok || !data.data) throw new Error(data.error ?? "Directory pin failed");
|
|
1479
|
+
return data.data;
|
|
1480
|
+
}
|
|
1481
|
+
async function getBackendSignedUrl(config, kind = "image") {
|
|
1482
|
+
const res = await (config.fetchImpl ?? fetch)(`${endpoint(config, "signed-url")}?kind=${kind}`, {
|
|
1483
|
+
method: "GET",
|
|
1484
|
+
headers: headers(config)
|
|
1485
|
+
});
|
|
1486
|
+
const data = await res.json().catch(() => ({}));
|
|
1487
|
+
if (!res.ok || !data.data) throw new Error(data.error ?? "Failed to create upload URL");
|
|
1488
|
+
return data.data.url;
|
|
1489
|
+
}
|
|
1490
|
+
|
|
1382
1491
|
// src/metadata.ts
|
|
1383
1492
|
var RESERVED_TRAITS = /* @__PURE__ */ new Set([
|
|
1384
1493
|
"Creator",
|
|
@@ -1472,6 +1581,6 @@ function resolveSafeImageContentType(contentType) {
|
|
|
1472
1581
|
}
|
|
1473
1582
|
var MAX_IPFS_GATEWAY_RESPONSE_BYTES = 25 * 1024 * 1024;
|
|
1474
1583
|
|
|
1475
|
-
export { ApiClient, CHAINS, DEFAULT_CHAIN, DEFAULT_CURRENCY, FeeConfigSchema, IPFS_SAFE_CONTENT_TYPE_PREFIXES, MAX_IPFS_GATEWAY_RESPONSE_BYTES, MedialaneApiError, OPEN_LICENSES, PUBLIC_RPC_FALLBACKS, RESERVED_TRAITS, STARKNET_COLLECTION_1155_CLASS_HASH, STARKNET_COLLECTION_1155_CONTRACT, STARKNET_COLLECTION_1155_FACTORY_CLASS_HASH, STARKNET_COLLECTION_1155_START_BLOCK, STARKNET_COLLECTION_721_CONTRACT, STARKNET_COLLECTION_721_START_BLOCK, STARKNET_CREATOR_COIN_CLASS_HASH, STARKNET_CREATOR_COIN_EKUBO_LAUNCHER, STARKNET_CREATOR_COIN_FACTORY_CLASS_HASH, STARKNET_CREATOR_COIN_FACTORY_CONTRACT, STARKNET_CREATOR_COIN_START_BLOCK, STARKNET_DROP_COLLECTION_CLASS_HASH, STARKNET_DROP_FACTORY_CONTRACT, STARKNET_EKUBO_CORE, STARKNET_IPCOLLECTION_CLASS_HASH, STARKNET_IPNFT_CLASS_HASH, STARKNET_IP_CLUB_COLLECTION_CLASS_HASH, STARKNET_IP_CLUB_FACTORY_CONTRACT, STARKNET_IP_SPONSORSHIP_CLASS_HASH, STARKNET_IP_SPONSORSHIP_CONTRACT, STARKNET_IP_TICKETS_FACTORY_CONTRACT, STARKNET_IP_TICKET_COLLECTION_CLASS_HASH, STARKNET_MARKETPLACE_1155_CLASS_HASH, STARKNET_MARKETPLACE_1155_CONTRACT, STARKNET_MARKETPLACE_1155_START_BLOCK, STARKNET_MARKETPLACE_721_CLASS_HASH, STARKNET_MARKETPLACE_721_CONTRACT, STARKNET_MARKETPLACE_721_START_BLOCK, STARKNET_NFTCOMMENTS_CONTRACT, STARKNET_POP_COLLECTION_CLASS_HASH, STARKNET_POP_FACTORY_CONTRACT, SUPPORTED_TOKENS, SUPPORTED_URL_CHAINS, assetHref, buildAssetMetadata, chainFromSlug, chainSlug, coinHref, collectionHref, createBackendProxyHandler, createFailoverFetch, createRateLimiter, createRpcProxyHandler, encodeU256, formatAmount, getCoordinates, getDerivativesTerm, getListableTokens, getService, getServicesByCapability, getStarknetCoordinates, getTokenByAddress, getTokenBySymbol, hasCapability, isSameOrigin, isServiceId, isTransientRpcError, isValidIpfsCidPath, listServices, normalizeAddress, normalizeHash, parseAmount, requestIp, resolveAppFeeConfig, resolveConfig, resolveFeeConfig, resolveRemixPolicy, resolveSafeImageContentType, shortenAddress, stringifyBigInts, u256ToBigInt };
|
|
1584
|
+
export { ALLOWED_IMAGE_CONTENT_TYPES, ApiClient, CHAINS, DEFAULT_CHAIN, DEFAULT_CURRENCY, FeeConfigSchema, IPFS_SAFE_CONTENT_TYPE_PREFIXES, MAX_IMAGE_PROXY_BYTES, MAX_IMAGE_REDIRECTS, MAX_IPFS_GATEWAY_RESPONSE_BYTES, MedialaneApiError, OPEN_LICENSES, PUBLIC_RPC_FALLBACKS, RESERVED_TRAITS, STARKNET_COLLECTION_1155_CLASS_HASH, STARKNET_COLLECTION_1155_CONTRACT, STARKNET_COLLECTION_1155_FACTORY_CLASS_HASH, STARKNET_COLLECTION_1155_START_BLOCK, STARKNET_COLLECTION_721_CONTRACT, STARKNET_COLLECTION_721_START_BLOCK, STARKNET_CREATOR_COIN_CLASS_HASH, STARKNET_CREATOR_COIN_EKUBO_LAUNCHER, STARKNET_CREATOR_COIN_FACTORY_CLASS_HASH, STARKNET_CREATOR_COIN_FACTORY_CONTRACT, STARKNET_CREATOR_COIN_START_BLOCK, STARKNET_DROP_COLLECTION_CLASS_HASH, STARKNET_DROP_FACTORY_CONTRACT, STARKNET_EKUBO_CORE, STARKNET_IPCOLLECTION_CLASS_HASH, STARKNET_IPNFT_CLASS_HASH, STARKNET_IP_CLUB_COLLECTION_CLASS_HASH, STARKNET_IP_CLUB_FACTORY_CONTRACT, STARKNET_IP_SPONSORSHIP_CLASS_HASH, STARKNET_IP_SPONSORSHIP_CONTRACT, STARKNET_IP_TICKETS_FACTORY_CONTRACT, STARKNET_IP_TICKET_COLLECTION_CLASS_HASH, STARKNET_MARKETPLACE_1155_CLASS_HASH, STARKNET_MARKETPLACE_1155_CONTRACT, STARKNET_MARKETPLACE_1155_START_BLOCK, STARKNET_MARKETPLACE_721_CLASS_HASH, STARKNET_MARKETPLACE_721_CONTRACT, STARKNET_MARKETPLACE_721_START_BLOCK, STARKNET_NFTCOMMENTS_CONTRACT, STARKNET_POP_COLLECTION_CLASS_HASH, STARKNET_POP_FACTORY_CONTRACT, SUPPORTED_TOKENS, SUPPORTED_URL_CHAINS, assetHref, buildAssetMetadata, chainFromSlug, chainSlug, coinHref, collectionHref, createBackendProxyHandler, createFailoverFetch, createRateLimiter, createRpcProxyHandler, encodeU256, formatAmount, getBackendSignedUrl, getCoordinates, getDerivativesTerm, getListableTokens, getService, getServicesByCapability, getStarknetCoordinates, getTokenByAddress, getTokenBySymbol, hasCapability, isPrivateHost, isSameOrigin, isServiceId, isTransientRpcError, isValidIpfsCidPath, listServices, normalizeAddress, normalizeHash, parseAmount, requestIp, resolveAppFeeConfig, resolveConfig, resolveFeeConfig, resolveRemixPolicy, resolveSafeImageContentType, shortenAddress, stringifyBigInts, u256ToBigInt, uploadDirectoryToBackend, uploadFileToBackend, uploadJsonToBackend, validateUrl };
|
|
1476
1585
|
//# sourceMappingURL=index.js.map
|
|
1477
1586
|
//# sourceMappingURL=index.js.map
|