{"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":[]}