@medialane/sdk 0.85.10 → 0.85.12
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 +81 -80
- package/dist/index.cjs +174 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +14 -1
- package/dist/index.d.ts +14 -1
- package/dist/index.js +171 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -401,6 +401,19 @@ interface FailoverFetchOptions {
|
|
|
401
401
|
}
|
|
402
402
|
declare function createFailoverFetch(urls: string[], options?: FailoverFetchOptions): typeof fetch;
|
|
403
403
|
|
|
404
|
+
declare const DEFAULT_STARKNET_RPC_METHODS: readonly string[];
|
|
405
|
+
interface RpcProxyConfig {
|
|
406
|
+
rpcUrls: string[];
|
|
407
|
+
allowedMethods?: readonly string[];
|
|
408
|
+
backendUrl: string;
|
|
409
|
+
apiKey: string | undefined;
|
|
410
|
+
checkRateLimit: (ip: string) => boolean;
|
|
411
|
+
}
|
|
412
|
+
declare function createRpcProxyHandler(config: RpcProxyConfig): (req: Request) => Promise<Response>;
|
|
413
|
+
|
|
414
|
+
declare function createRateLimiter(windowMs: number, max: number): (key: string) => boolean;
|
|
415
|
+
declare function requestIp(req: Request): string;
|
|
416
|
+
|
|
404
417
|
type AssetAttribute = {
|
|
405
418
|
trait_type: string;
|
|
406
419
|
value: string;
|
|
@@ -441,4 +454,4 @@ declare const IPFS_SAFE_CONTENT_TYPE_PREFIXES: readonly ["image/jpeg", "image/pn
|
|
|
441
454
|
declare function resolveSafeImageContentType(contentType: string): string;
|
|
442
455
|
declare const MAX_IPFS_GATEWAY_RESPONSE_BYTES: number;
|
|
443
456
|
|
|
444
|
-
export { type AssetAttribute, type AssetMetadata, type BuildAssetMetadataInput, Chain, DEFAULT_CURRENCY, type FailoverFetchOptions, IPFS_SAFE_CONTENT_TYPE_PREFIXES, MAX_IPFS_GATEWAY_RESPONSE_BYTES, 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, ServiceCapability, ServiceDefinition, type ServiceId, type SupportedToken, type SupportedTokenSymbol, assetHref, buildAssetMetadata, chainFromSlug, chainSlug, coinHref, collectionHref, createFailoverFetch, encodeU256, formatAmount, getListableTokens, getService, getServicesByCapability, getTokenByAddress, getTokenBySymbol, hasCapability, isServiceId, isTransientRpcError, isValidIpfsCidPath, listServices, normalizeAddress, normalizeHash, parseAmount, resolveSafeImageContentType, shortenAddress, stringifyBigInts, u256ToBigInt };
|
|
457
|
+
export { type AssetAttribute, type AssetMetadata, type BuildAssetMetadataInput, Chain, DEFAULT_CURRENCY, DEFAULT_STARKNET_RPC_METHODS, type FailoverFetchOptions, IPFS_SAFE_CONTENT_TYPE_PREFIXES, MAX_IPFS_GATEWAY_RESPONSE_BYTES, PUBLIC_RPC_FALLBACKS, RESERVED_TRAITS, 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, createFailoverFetch, createRateLimiter, createRpcProxyHandler, encodeU256, formatAmount, getListableTokens, getService, getServicesByCapability, getTokenByAddress, getTokenBySymbol, hasCapability, isServiceId, isTransientRpcError, isValidIpfsCidPath, listServices, normalizeAddress, normalizeHash, parseAmount, requestIp, resolveSafeImageContentType, shortenAddress, stringifyBigInts, u256ToBigInt };
|
package/dist/index.d.ts
CHANGED
|
@@ -401,6 +401,19 @@ interface FailoverFetchOptions {
|
|
|
401
401
|
}
|
|
402
402
|
declare function createFailoverFetch(urls: string[], options?: FailoverFetchOptions): typeof fetch;
|
|
403
403
|
|
|
404
|
+
declare const DEFAULT_STARKNET_RPC_METHODS: readonly string[];
|
|
405
|
+
interface RpcProxyConfig {
|
|
406
|
+
rpcUrls: string[];
|
|
407
|
+
allowedMethods?: readonly string[];
|
|
408
|
+
backendUrl: string;
|
|
409
|
+
apiKey: string | undefined;
|
|
410
|
+
checkRateLimit: (ip: string) => boolean;
|
|
411
|
+
}
|
|
412
|
+
declare function createRpcProxyHandler(config: RpcProxyConfig): (req: Request) => Promise<Response>;
|
|
413
|
+
|
|
414
|
+
declare function createRateLimiter(windowMs: number, max: number): (key: string) => boolean;
|
|
415
|
+
declare function requestIp(req: Request): string;
|
|
416
|
+
|
|
404
417
|
type AssetAttribute = {
|
|
405
418
|
trait_type: string;
|
|
406
419
|
value: string;
|
|
@@ -441,4 +454,4 @@ declare const IPFS_SAFE_CONTENT_TYPE_PREFIXES: readonly ["image/jpeg", "image/pn
|
|
|
441
454
|
declare function resolveSafeImageContentType(contentType: string): string;
|
|
442
455
|
declare const MAX_IPFS_GATEWAY_RESPONSE_BYTES: number;
|
|
443
456
|
|
|
444
|
-
export { type AssetAttribute, type AssetMetadata, type BuildAssetMetadataInput, Chain, DEFAULT_CURRENCY, type FailoverFetchOptions, IPFS_SAFE_CONTENT_TYPE_PREFIXES, MAX_IPFS_GATEWAY_RESPONSE_BYTES, 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, ServiceCapability, ServiceDefinition, type ServiceId, type SupportedToken, type SupportedTokenSymbol, assetHref, buildAssetMetadata, chainFromSlug, chainSlug, coinHref, collectionHref, createFailoverFetch, encodeU256, formatAmount, getListableTokens, getService, getServicesByCapability, getTokenByAddress, getTokenBySymbol, hasCapability, isServiceId, isTransientRpcError, isValidIpfsCidPath, listServices, normalizeAddress, normalizeHash, parseAmount, resolveSafeImageContentType, shortenAddress, stringifyBigInts, u256ToBigInt };
|
|
457
|
+
export { type AssetAttribute, type AssetMetadata, type BuildAssetMetadataInput, Chain, DEFAULT_CURRENCY, DEFAULT_STARKNET_RPC_METHODS, type FailoverFetchOptions, IPFS_SAFE_CONTENT_TYPE_PREFIXES, MAX_IPFS_GATEWAY_RESPONSE_BYTES, PUBLIC_RPC_FALLBACKS, RESERVED_TRAITS, 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, createFailoverFetch, createRateLimiter, createRpcProxyHandler, encodeU256, formatAmount, getListableTokens, getService, getServicesByCapability, getTokenByAddress, getTokenBySymbol, hasCapability, isServiceId, isTransientRpcError, isValidIpfsCidPath, listServices, normalizeAddress, normalizeHash, parseAmount, requestIp, resolveSafeImageContentType, shortenAddress, stringifyBigInts, u256ToBigInt };
|
package/dist/index.js
CHANGED
|
@@ -1279,6 +1279,176 @@ function createFailoverFetch(urls, options = {}) {
|
|
|
1279
1279
|
return failover;
|
|
1280
1280
|
}
|
|
1281
1281
|
|
|
1282
|
+
// src/server/rate-limit.ts
|
|
1283
|
+
function createRateLimiter(windowMs, max) {
|
|
1284
|
+
const counts = /* @__PURE__ */ new Map();
|
|
1285
|
+
let nextSweepAt = Date.now() + windowMs;
|
|
1286
|
+
return function checkRateLimit(key) {
|
|
1287
|
+
const now = Date.now();
|
|
1288
|
+
if (now >= nextSweepAt) {
|
|
1289
|
+
for (const [k, entry2] of counts) {
|
|
1290
|
+
if (now >= entry2.resetAt) counts.delete(k);
|
|
1291
|
+
}
|
|
1292
|
+
nextSweepAt = now + windowMs;
|
|
1293
|
+
}
|
|
1294
|
+
const entry = counts.get(key);
|
|
1295
|
+
if (!entry || now >= entry.resetAt) {
|
|
1296
|
+
counts.set(key, { count: 1, resetAt: now + windowMs });
|
|
1297
|
+
return true;
|
|
1298
|
+
}
|
|
1299
|
+
if (entry.count >= max) return false;
|
|
1300
|
+
entry.count += 1;
|
|
1301
|
+
return true;
|
|
1302
|
+
};
|
|
1303
|
+
}
|
|
1304
|
+
function requestIp(req) {
|
|
1305
|
+
return req.headers.get("x-forwarded-for")?.split(",")[0].trim() ?? "unknown";
|
|
1306
|
+
}
|
|
1307
|
+
|
|
1308
|
+
// src/server/rpc-proxy.ts
|
|
1309
|
+
var DEFAULT_STARKNET_RPC_METHODS = [
|
|
1310
|
+
"starknet_call",
|
|
1311
|
+
"starknet_addInvokeTransaction",
|
|
1312
|
+
"starknet_getTransactionReceipt",
|
|
1313
|
+
"starknet_getTransactionStatus",
|
|
1314
|
+
"starknet_getTransactionByHash",
|
|
1315
|
+
"starknet_getTransaction",
|
|
1316
|
+
"starknet_getBlockWithReceipts",
|
|
1317
|
+
"starknet_estimateFee",
|
|
1318
|
+
"starknet_getNonce",
|
|
1319
|
+
"starknet_simulateTransactions",
|
|
1320
|
+
"starknet_specVersion",
|
|
1321
|
+
"starknet_chainId",
|
|
1322
|
+
"starknet_blockNumber",
|
|
1323
|
+
"starknet_blockHashAndNumber",
|
|
1324
|
+
"starknet_getClassAt",
|
|
1325
|
+
"starknet_getClass",
|
|
1326
|
+
"starknet_getClassHashAt",
|
|
1327
|
+
"starknet_getStorageAt",
|
|
1328
|
+
"starknet_getBlockWithTxHashes",
|
|
1329
|
+
"starknet_getBlockWithTxs",
|
|
1330
|
+
"starknet_getEvents"
|
|
1331
|
+
];
|
|
1332
|
+
function isAllowedMethod(body, allowed) {
|
|
1333
|
+
if (Array.isArray(body)) {
|
|
1334
|
+
return body.every((item) => isAllowedMethod(item, allowed));
|
|
1335
|
+
}
|
|
1336
|
+
if (body && typeof body === "object") {
|
|
1337
|
+
const method = body.method;
|
|
1338
|
+
return typeof method === "string" && allowed.has(method);
|
|
1339
|
+
}
|
|
1340
|
+
return false;
|
|
1341
|
+
}
|
|
1342
|
+
function extractMethod(body) {
|
|
1343
|
+
if (Array.isArray(body)) return "batch";
|
|
1344
|
+
if (body && typeof body === "object") {
|
|
1345
|
+
const method = body.method;
|
|
1346
|
+
if (typeof method === "string") return method;
|
|
1347
|
+
}
|
|
1348
|
+
return "unknown";
|
|
1349
|
+
}
|
|
1350
|
+
function isSameOrigin(req) {
|
|
1351
|
+
const origin = req.headers.get("origin");
|
|
1352
|
+
if (!origin) return true;
|
|
1353
|
+
const host = req.headers.get("host");
|
|
1354
|
+
try {
|
|
1355
|
+
return new URL(origin).host === host;
|
|
1356
|
+
} catch {
|
|
1357
|
+
return false;
|
|
1358
|
+
}
|
|
1359
|
+
}
|
|
1360
|
+
function rpcError(code, message, status = 200, id = null) {
|
|
1361
|
+
return Response.json({ jsonrpc: "2.0", error: { code, message }, id }, { status });
|
|
1362
|
+
}
|
|
1363
|
+
async function billRpcCall(backendUrl, apiKey, method) {
|
|
1364
|
+
if (!apiKey) {
|
|
1365
|
+
console.error("[rpc-proxy] no API key configured \u2014 refusing to bill/forward");
|
|
1366
|
+
return false;
|
|
1367
|
+
}
|
|
1368
|
+
try {
|
|
1369
|
+
const res = await fetch(`${backendUrl.replace(/\/$/, "")}/v1/rpc/meter`, {
|
|
1370
|
+
method: "POST",
|
|
1371
|
+
headers: { "Content-Type": "application/json", "x-api-key": apiKey },
|
|
1372
|
+
body: JSON.stringify({ method })
|
|
1373
|
+
});
|
|
1374
|
+
return res.ok;
|
|
1375
|
+
} catch (err) {
|
|
1376
|
+
console.error("[rpc-proxy] billing call failed", { err: err instanceof Error ? err.message : String(err) });
|
|
1377
|
+
return false;
|
|
1378
|
+
}
|
|
1379
|
+
}
|
|
1380
|
+
function createRpcProxyHandler(config) {
|
|
1381
|
+
const allowed = new Set(config.allowedMethods ?? DEFAULT_STARKNET_RPC_METHODS);
|
|
1382
|
+
return async function handleRpcProxy(req) {
|
|
1383
|
+
if (!isSameOrigin(req)) {
|
|
1384
|
+
return rpcError(-32600, "Cross-origin requests are not allowed", 403);
|
|
1385
|
+
}
|
|
1386
|
+
if (!config.checkRateLimit(requestIp(req))) {
|
|
1387
|
+
return rpcError(-32005, "Too many requests", 429);
|
|
1388
|
+
}
|
|
1389
|
+
let body;
|
|
1390
|
+
try {
|
|
1391
|
+
body = await req.json();
|
|
1392
|
+
} catch {
|
|
1393
|
+
return rpcError(-32700, "Parse error");
|
|
1394
|
+
}
|
|
1395
|
+
if (!isAllowedMethod(body, allowed)) {
|
|
1396
|
+
const method2 = !Array.isArray(body) && body && typeof body === "object" ? String(body.method ?? "<unknown>") : "<batch or invalid>";
|
|
1397
|
+
return rpcError(-32601, `Method not allowed: ${method2}`);
|
|
1398
|
+
}
|
|
1399
|
+
const method = extractMethod(body);
|
|
1400
|
+
if (!await billRpcCall(config.backendUrl, config.apiKey, method)) {
|
|
1401
|
+
return rpcError(-32003, "Insufficient credits or billing unavailable \u2014 RPC call not forwarded", 402);
|
|
1402
|
+
}
|
|
1403
|
+
let lastError = "No RPC upstream configured";
|
|
1404
|
+
for (const rpcUrl of config.rpcUrls) {
|
|
1405
|
+
try {
|
|
1406
|
+
const response = await fetch(rpcUrl, {
|
|
1407
|
+
method: "POST",
|
|
1408
|
+
headers: { "Content-Type": "application/json" },
|
|
1409
|
+
body: JSON.stringify(body)
|
|
1410
|
+
});
|
|
1411
|
+
const text = await response.text();
|
|
1412
|
+
const upstream = rpcUrl.split("/")[2];
|
|
1413
|
+
if (!text) {
|
|
1414
|
+
lastError = `Upstream RPC returned empty body (HTTP ${response.status})`;
|
|
1415
|
+
console.warn("[rpc-proxy] upstream returned empty body", { status: response.status, upstream });
|
|
1416
|
+
continue;
|
|
1417
|
+
}
|
|
1418
|
+
try {
|
|
1419
|
+
const data = JSON.parse(text);
|
|
1420
|
+
if (isTransientRpcError({ status: response.status, body: data })) {
|
|
1421
|
+
const errObj = data.error;
|
|
1422
|
+
lastError = `Upstream RPC returned transient JSON-RPC error: ${String(errObj?.message ?? "(no message)")}`;
|
|
1423
|
+
console.warn("[rpc-proxy] upstream returned transient JSON-RPC error", {
|
|
1424
|
+
upstream,
|
|
1425
|
+
code: errObj?.code,
|
|
1426
|
+
message: errObj?.message
|
|
1427
|
+
});
|
|
1428
|
+
continue;
|
|
1429
|
+
}
|
|
1430
|
+
return Response.json(data, { status: 200 });
|
|
1431
|
+
} catch {
|
|
1432
|
+
lastError = `Upstream RPC returned non-JSON (HTTP ${response.status})`;
|
|
1433
|
+
console.warn("[rpc-proxy] upstream returned non-JSON", {
|
|
1434
|
+
status: response.status,
|
|
1435
|
+
upstream,
|
|
1436
|
+
bodyPreview: text.slice(0, 200)
|
|
1437
|
+
});
|
|
1438
|
+
continue;
|
|
1439
|
+
}
|
|
1440
|
+
} catch (err) {
|
|
1441
|
+
lastError = `Upstream RPC unreachable: ${err instanceof Error ? err.message : "unknown error"}`;
|
|
1442
|
+
console.warn("[rpc-proxy] upstream fetch failed", {
|
|
1443
|
+
upstream: rpcUrl.split("/")[2],
|
|
1444
|
+
err: err instanceof Error ? err.message : String(err)
|
|
1445
|
+
});
|
|
1446
|
+
}
|
|
1447
|
+
}
|
|
1448
|
+
return rpcError(-32603, lastError);
|
|
1449
|
+
};
|
|
1450
|
+
}
|
|
1451
|
+
|
|
1282
1452
|
// src/metadata.ts
|
|
1283
1453
|
var RESERVED_TRAITS = /* @__PURE__ */ new Set([
|
|
1284
1454
|
"Creator",
|
|
@@ -1359,6 +1529,6 @@ function resolveSafeImageContentType(contentType) {
|
|
|
1359
1529
|
}
|
|
1360
1530
|
var MAX_IPFS_GATEWAY_RESPONSE_BYTES = 25 * 1024 * 1024;
|
|
1361
1531
|
|
|
1362
|
-
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, createFailoverFetch, encodeU256, formatAmount, getCoordinates, getListableTokens, getService, getServicesByCapability, getStarknetCoordinates, getTokenByAddress, getTokenBySymbol, hasCapability, isServiceId, isTransientRpcError, isValidIpfsCidPath, listServices, normalizeAddress, normalizeHash, parseAmount, resolveConfig, resolveFeeConfig, resolveSafeImageContentType, shortenAddress, stringifyBigInts, u256ToBigInt };
|
|
1532
|
+
export { ApiClient, CHAINS, DEFAULT_CHAIN, DEFAULT_CURRENCY, DEFAULT_STARKNET_RPC_METHODS, 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, createFailoverFetch, createRateLimiter, createRpcProxyHandler, encodeU256, formatAmount, getCoordinates, getListableTokens, getService, getServicesByCapability, getStarknetCoordinates, getTokenByAddress, getTokenBySymbol, hasCapability, isServiceId, isTransientRpcError, isValidIpfsCidPath, listServices, normalizeAddress, normalizeHash, parseAmount, requestIp, resolveConfig, resolveFeeConfig, resolveSafeImageContentType, shortenAddress, stringifyBigInts, u256ToBigInt };
|
|
1363
1533
|
//# sourceMappingURL=index.js.map
|
|
1364
1534
|
//# sourceMappingURL=index.js.map
|