@fastnear/wallet-adapter
Version:
Wallet adapter implementations for Meteor Wallet and Near Mobile
1 lines • 6.94 kB
Source Map (JSON)
{"version":3,"sources":["../../src/rpc.ts"],"sourcesContent":["import { TransportError } from \"./errors.js\";\nimport type { WalletNetwork } from \"./types.js\";\n\ninterface JsonRpcResponse<T> {\n result?: T;\n error?: {\n code?: number;\n message?: string;\n data?: unknown;\n name?: string;\n };\n}\n\nconst defaultProviders: Record<WalletNetwork, string[]> = {\n mainnet: [\"https://relmn.aurora.dev\", \"https://nearrpc.aurora.dev\", \"https://rpc.mainnet.near.org\"],\n testnet: [\"https://rpc.testnet.near.org\"],\n};\n\nconst wait = (timeout: number) => new Promise<void>((resolve) => setTimeout(resolve, timeout));\n\nlet rpcId = 1000;\n\nexport class NearRpcClient {\n private readonly providers: string[];\n private index = 0;\n private timeoutMs: number;\n private readonly startTimeoutMs: number;\n\n constructor(providers: string[], timeoutMs = 30_000) {\n this.providers = providers.length > 0 ? providers : defaultProviders.mainnet;\n this.timeoutMs = timeoutMs;\n this.startTimeoutMs = timeoutMs;\n }\n\n async block(params: { finality: \"final\" | \"optimistic\" }): Promise<any> {\n return this.sendJsonRpc(\"block\", params);\n }\n\n async query<T = any>(params: Record<string, any>): Promise<T> {\n return this.sendJsonRpc<T>(\"query\", params);\n }\n\n async txStatus(txHash: string, accountId: string, waitUntil?: string): Promise<any> {\n return this.sendJsonRpc(\"tx\", {\n tx_hash: txHash,\n sender_account_id: accountId,\n wait_until: waitUntil,\n });\n }\n\n private async sendJsonRpc<T>(method: string, params: any, attempt = 0): Promise<T> {\n const provider = this.providers[this.index];\n try {\n const result = await this.send<T>(provider, method, params, this.timeoutMs);\n this.timeoutMs = Math.max(this.startTimeoutMs, Math.floor(this.timeoutMs / 1.2));\n return result;\n } catch (error) {\n const providersExhausted = attempt + 1 >= this.providers.length * 3;\n this.index = (this.index + 1) % this.providers.length;\n this.timeoutMs = Math.min(60_000, Math.floor(this.timeoutMs * 1.2));\n\n if (providersExhausted) {\n throw error;\n }\n\n await wait(Math.min(500 * (attempt + 1), 3_000));\n return this.sendJsonRpc<T>(method, params, attempt + 1);\n }\n }\n\n private async send<T>(provider: string, method: string, params: any, timeoutMs: number): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(provider, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: rpcId++,\n method,\n params,\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"Unknown RPC error\");\n throw new TransportError(\"RPC_HTTP_ERROR\", `RPC request failed (${response.status}): ${text}`);\n }\n\n const json = (await response.json()) as JsonRpcResponse<T>;\n\n if (json.error) {\n const message = typeof json.error.data === \"string\" ? json.error.data : json.error.message ?? \"RPC error\";\n throw new TransportError(\"RPC_RESPONSE_ERROR\", message, { details: json.error });\n }\n\n return json.result as T;\n } catch (error: any) {\n if (controller.signal.aborted) {\n throw new TransportError(\"RPC_TIMEOUT\", \"RPC request timed out\", { cause: error });\n }\n\n if (error instanceof TransportError) throw error;\n throw new TransportError(\"RPC_NETWORK_ERROR\", \"RPC network request failed\", { cause: error });\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\nexport const createRpcFactory = (\n getNetworkProviders?: (network: WalletNetwork) => string[],\n): ((network: WalletNetwork) => NearRpcClient) => {\n const clients: Partial<Record<WalletNetwork, NearRpcClient>> = {};\n\n return (network: WalletNetwork) => {\n if (clients[network] != null) return clients[network] as NearRpcClient;\n const providers = getNetworkProviders?.(network);\n clients[network] = new NearRpcClient(providers && providers.length > 0 ? providers : defaultProviders[network]);\n return clients[network] as NearRpcClient;\n };\n};\n"],"mappings":"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","names":[]}