{"mappings":"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","sources":["src/index.ts","src/providers/dapp-provider.ts","src/providers/peer-provider.ts","src/clients/jsonrpc-ws-client.ts","src/utils/crypto-utils.ts","src/clients/jsonrpc-error.ts","src/providers/wallet-provider.ts"],"sourcesContent":["export { default as DAppProvider } from './providers/dapp-provider';\r\nexport { default as WalletProvider } from './providers/wallet-provider';\r\nexport { JsonRpcError, JsonRpcErrorCode } from './clients/jsonrpc-error';\r\n\r\nexport type * from './types';","import type { AddTokenRequest, DAppInfo, SendTransactionRequest, SessionDetails, SignMessageRequest, SignTransactionRequest, AccountDetails } from \"../types\";\nimport PeerProvider from \"./peer-provider\";\n\n/**\n * A provider for wallet apps to connect with dApps.\n * \n * This class is used by a wallet to establish a session with a dApp using a pairing URI.\n * \n * @example\n * ```typescript\n * // Wallet-side implementation\n * const provider = new DAppProvider(\"wl:1@relay.net/...\");\n * await provider.connect();\n * const dAppInfo = await provider.getAppInfo();\n * console.log(\"Connected to dApp:\", dAppInfo.name);\n * ```\n */\nexport default class DAppProvider extends PeerProvider {\n\n  /**\n   * Creates an instance of DAppProvider.\n   * \n   * @param pairingURI - The dApp pairing URI, usually scanned from a QR code.\n   */\n  constructor(pairingURI: string) {\n    let { version, relayUrl, secret, sessionId } = DAppProvider.parsePairingURI(pairingURI);\n    super(version, relayUrl, secret, sessionId);\n  }\n\n  /**\n   * Parses a pairing URI to extract session details.\n   * \n   * @param uri - The pairing URI.\n   * @returns The session details.\n   * @throws If the URI is invalid.\n   * @internal\n   */\n  private static parsePairingURI(uri: string): SessionDetails {\n    if (!uri.startsWith(\"wl:\")) {\n      throw new Error(\"Invalid pairing uri prefix\");\n    }\n\n    const uriBody = uri.substring(3);\n    const atIndex = uriBody.indexOf('@');\n    if (atIndex < 0) {\n      throw new Error(\"Invalid pairing uri: missing version\");\n    }\n\n    const version = uriBody.substring(0, atIndex);\n    const relayPart = uriBody.substring(atIndex + 1);\n\n    const url = new URL(relayPart);\n    const sessionId = url.searchParams.get(\"session\");\n    const secret = url.searchParams.get(\"secret\");\n\n    if (!sessionId || !secret) {\n      throw new Error(\"Missing session or secret\");\n    }\n\n    return {\n      version,\n      relayUrl: url.origin + url.pathname,\n      secret,\n      sessionId,\n    };\n  }\n\n  /**\n   * Retrieves the dApp info from the session.\n   * \n   * @param timeoutMs - The connection timeout in milliseconds. Default 10_000ms\n   * @returns A promise that resolves with the dApp information.\n   * @throws If the request fails or no app info is received.\n   */\n  public async getAppInfo(timeoutMs = 10_000): Promise<DAppInfo> {\n    let appInfo = await this.sendRequest<DAppInfo>(\"wl_getAppInfo\", [this.sessionId], { encrypted: false, timeout: timeoutMs });\n    if (!appInfo) {\n      throw new Error(\"No app info received\");\n    }\n\n    return appInfo;\n  }\n\n  /**\n   * Join a session and nofity the dApp that the wallet has joined.\n   * \n   * @param walletAddress - The address of the wallet joining the session.\n   * @param timeoutMs - The request timeout in milliseconds. Default 10_000ms\n   * @returns A promise that resolves to true if the notification was sent successfully.\n   * @throws If the operation fails.\n   */\n  public async joinSession(walletAddress: string, timeoutMs = 10_000): Promise<boolean> {\n    let success = await this.sendRequest<boolean>(\"wl_joinSession\", [this.sessionId, \"wallet\"], { encrypted: false, timeout: timeoutMs });\n    if (!success) {\n      throw new Error(\"Failed to join session\");\n    }\n\n    // Notify the dApp (encrypted)\n    await this.sendNotification(\"wl_sessionJoined\", [walletAddress]);\n\n    return success;\n  }\n\n  /**\n   * Registers a handler for the \"wallet_signMessage\" request from the dApp.\n   * \n   * @param handler - The function to handle the sign message request.\n   */\n  public onSignMessage(handler: (signMsgReq: SignMessageRequest) => Promise<string> | string): void {\n    this.on(\"wallet_signMessage\", handler);\n  }\n\n  /**\n   * Registers a handler for the \"wallet_addToken\" request from the dApp.\n   * \n   * @param handler - The function to handle the add token request.\n   */\n  public onAddToken(handler: (addTokenReq: AddTokenRequest) => Promise<boolean> | boolean): void {\n    this.on(\"wallet_addToken\", handler);\n  }\n\n  /**\n   * Registers a handler for the \"wallet_signTransaction\" request from the dApp.\n   * \n   * @param handler - The function to handle the sign transaction request.\n   */\n  public onSignTransaction(handler: (signTxReq: SignTransactionRequest) => Promise<string> | string): void {\n    this.on(\"wallet_signTransaction\", handler);\n  }\n\n  /**\n   * Registers a handler for the \"wallet_sendTransaction\" request from the dApp.\n   * \n   * @param handler - The function to handle the send transaction request.\n   */\n  public onSendTransaction(handler: (sendTxReq: SendTransactionRequest) => Promise<string> | string): void {\n    this.on(\"wallet_sendTransaction\", handler);\n  }\n\n  /**\n   * Registers a handler for the \"wallet_getAccount\" request from the dApp.\n   *\n   * @param handler - The function to handle the get account request.\n   */\n  public onGetAccount(handler: () => Promise<AccountDetails> | AccountDetails): void {\n    this.on(\"wallet_getAccount\", handler);\n  }\n}","import JsonRpcWsClient from \"../clients/jsonrpc-ws-client\";\nimport type { JsonRpcParams, PendingMessage, RequestOptions, RpcHandler, SessionDetails } from \"../types\";\nimport CryptoUtils from \"../utils/crypto-utils\";\n\nexport default abstract class PeerProvider {\n\n  private client: JsonRpcWsClient;\n\n  protected relayUrl: string;\n  protected secret: string;\n  protected sessionId: string;\n  protected version: string;\n\n  /**\n   * Creates an instance of PeerProvider.\n   * \n   * @param version - The protocol version.\n   * @param relayUrl - The URL of the relay server.\n   * @param secret - The shared secret for encryption.\n   * @param sessionId - The session ID. Defaults to an empty string.\n   */\n  constructor(version: string, relayUrl: string, secret: string, sessionId = \"\") {\n    this.version = version;\n    this.relayUrl = relayUrl;\n    this.secret = secret;\n    this.sessionId = sessionId;\n    this.client = new JsonRpcWsClient(this.relayUrl, this.secret);\n  }\n\n  public getSessionInfo(): SessionDetails {\n    return {\n      version: this.version,\n      relayUrl: this.relayUrl,\n      sessionId: this.sessionId,\n      secret: this.secret\n    }\n  }\n\n  /**\n   * Connects to the relay server.\n   * \n   * @param timeoutMs - The connection timeout in milliseconds. Default is 10,000ms.\n   * @returns A promise that resolves to true when the connection is established.\n   */\n  public connect(timeoutMs = 10_000): Promise<boolean> {\n    return this.client.connect(timeoutMs);\n  }\n\n  public disconnect(): void {\n    this.client.disconnect();\n  }\n\n  /**\n   * Sends a JSON-RPC request to the peer.\n   * \n   * @param method - The RPC method name.\n   * @param params - The RPC method parameters.\n   * @param options - The request options, including timeout. Default timeout is 30,000ms.\n   * @returns A promise that resolves with the result of the RPC method.\n   */\n  public sendRequest<T>(method: string, params: JsonRpcParams, options: RequestOptions = { timeout: 30_000 }): Promise<T> {\n    return this.client.request(method, params, options);\n  }\n\n  /**\n   * Sends a JSON-RPC notification to the peer.\n   * \n   * @param method - The RPC method name.\n   * @param params - The RPC method parameters.\n   */\n  public sendNotification(method: string, params: JsonRpcParams, encrypted = true): Promise<void> {\n    return this.client.notify(method, params, encrypted);\n  }\n\n  /**\n   * Registers a handler for a specific RPC method.\n   * \n   * @param method - The RPC method name.\n   * @param handler - The function to handle the RPC request.\n   */\n  public on(method: string, handler: RpcHandler): void {\n    this.client.on(method, handler);\n  }\n\n  /**\n   * Removes a handler for a specific RPC method.\n   * \n   * @param method - The RPC method name.\n   */\n  public off(method: string): void {\n    this.client.off(method);\n  }\n\n  /**\n   * Registers a handler for when the peer disconnects from the session.\n   * \n   * @param handler - The function to handle the peer disconnection.\n   */\n  public onPeerDisconnect(handler: () => Promise<void> | void): void {\n    this.on('wl_sessionLeft', handler);\n  }\n\n  /**\n   * Registers a handler for when the session deleted.\n   * \n   * @param handler - The function to handle the session delete.\n   */\n  public onSessionDelete(handler: () => Promise<void> | void): void {\n    this.on('wl_sessionDeleted', () => {\n      this.sessionId = \"\";\n      handler();\n    });\n  }\n\n  /**\n   * Registers a handler for when the WebSocket connection is closed.\n   * \n   * @param handler - The function to handle the connection close event.\n   */\n  public onClose(handler: () => void): void {\n    this.client.onClose(handler);\n  }\n\n  /**\n   * Terminated the relay session.\n   */\n  public revokeSession(): Promise<void> {\n    return this.sendNotification(\"wl_revokeSession\", undefined, false);\n  }\n\n  /**\n   * Fetch pending messages that not delivered yet.\n   * \n   * @returns A list of serialized messages.\n   */\n  public async fetchPendingMessages(): Promise<PendingMessage[]> {\n    const messages: PendingMessage[] = [];\n    const pendingMessages = await this.sendRequest<PendingMessage[]>(\"wl_fetchPending\", undefined, { timeout: 10_000, encrypted: false });\n    for (const pendingMessage of pendingMessages) {\n      try {\n        const msg = await CryptoUtils.decrypt(pendingMessage.message, this.secret);\n        messages.push({ message: msg, createdAt: pendingMessage.createdAt });\n      } catch {\n        // drop unknown message\n      }\n    }\n    return messages;\n  }\n\n  /**\n   * Replay pending message to maintain the behavior like real time delivery.\n   */\n  public async replayMessage(message: string): Promise<void> {\n    return this.client.handleMessage(message);\n  }\n}","import WebSocket from \"isomorphic-ws\";\r\nimport CryptoUtils from \"../utils/crypto-utils\";\r\nimport type { JsonRpcErrorData, JsonRpcNotification, JsonRpcParams, JsonRpcRequest, JsonRpcResponse, RequestOptions, RpcHandler } from \"../types\";\r\nimport { JsonRpcError, JsonRpcErrorCode } from \"./jsonrpc-error\";\r\n\r\nexport default class JsonRpcWsClient {\r\n\r\n  private ws!: WebSocket;\r\n  private pending = new Map<string, { resolve: (res: any) => void; reject: (err: JsonRpcError) => void }>();\r\n  private handlers = new Map<string, RpcHandler>();\r\n  private nextId = 1;\r\n\r\n  private pingInterval = 15000;\r\n  private keepAliveTimer?: ReturnType<typeof setTimeout>;\r\n\r\n  private onCloseHandler?: () => void;\r\n\r\n  constructor(private url: string, private secret: string) {}\r\n\r\n  private initializeWebSocket(): void {\r\n    this.ws = new WebSocket(this.url);\r\n\r\n    this.ws.onmessage = async (event) => {\r\n      let msg: string;\r\n      try {\r\n        msg = await CryptoUtils.decrypt(event.data as string, this.secret);\r\n      } catch {\r\n        // If decrypt fails, assume it's unencrypted JSON (i.e., relay message)\r\n        msg = event.data as string;\r\n      }\r\n      this.handleMessage(msg);\r\n    };\r\n\r\n    this.ws.onclose = () => {\r\n      this.clearKeepAliveTimer();\r\n      if (this.onCloseHandler) {\r\n        this.onCloseHandler();\r\n      }\r\n    };\r\n\r\n    this.ws.onerror = () => {\r\n      this.ws.close();\r\n    };\r\n  }\r\n\r\n  public async connect(timeout: number): Promise<boolean> {\r\n    this.initializeWebSocket();\r\n\r\n    if (this.ws.readyState === WebSocket.OPEN) {\r\n      return true;\r\n    }\r\n\r\n    return new Promise<boolean>((resolve, reject) => {\r\n      const onOpen = (): void => {\r\n        cleanup();\r\n        resolve(true);\r\n      };\r\n\r\n      const onError = (): void => {\r\n        cleanup();\r\n        reject(new JsonRpcError(JsonRpcErrorCode.RequestFailed, 'Connection failed.'));\r\n      };\r\n\r\n      const timeoutId = setTimeout(() => {\r\n        cleanup();\r\n        if (this.ws.readyState !== WebSocket.CLOSED) {\r\n          this.ws.close();\r\n        }\r\n        reject(new JsonRpcError(JsonRpcErrorCode.RequestTimeout, `Connection timeout.`));\r\n      }, timeout);\r\n\r\n      const cleanup = (): void => {\r\n        clearTimeout(timeoutId);\r\n        this.ws.removeEventListener('open', onOpen);\r\n        this.ws.removeEventListener('error', onError);\r\n      };\r\n\r\n      this.ws.addEventListener('open', onOpen);\r\n      this.ws.addEventListener('error', onError);\r\n    });\r\n  }\r\n\r\n  public disconnect(): void {\r\n    this.clearKeepAliveTimer();\r\n    if (this.ws?.readyState === WebSocket.OPEN) {\r\n      this.ws.close();\r\n    }\r\n  }\r\n\r\n  public onClose(handler: () => void): void {\r\n    this.onCloseHandler = handler;\r\n  }\r\n\r\n  private setupKeepAliveTimer(): void {\r\n    if (this.keepAliveTimer) {\r\n      return;\r\n    }\r\n  \r\n    this.keepAliveTimer = setTimeout(() => {\r\n      this.send(JSON.stringify({\r\n        jsonrpc: '2.0',\r\n        id: \"keepAlive\",\r\n        method: 'wl_ping'\r\n      }));\r\n    }, this.pingInterval);\r\n  }\r\n\r\n  private clearKeepAliveTimer(): void {\r\n    if (this.keepAliveTimer) {\r\n      clearTimeout(this.keepAliveTimer);\r\n      this.keepAliveTimer = undefined;\r\n    }\r\n  }\r\n\r\n  private send(data: string): void {\r\n    this.clearKeepAliveTimer();\r\n    if (this.ws?.readyState !== WebSocket.OPEN) {\r\n      throw new JsonRpcError(JsonRpcErrorCode.ConnectionClosed, 'Connection closed.')\r\n    }\r\n    \r\n    this.setupKeepAliveTimer();\r\n    this.ws.send(data);\r\n  }\r\n\r\n  public async request<T>(method: string, params: JsonRpcParams, options: RequestOptions): Promise<T> {\r\n    let id = (this.nextId++).toString();\r\n    let payload: JsonRpcRequest = { jsonrpc: '2.0', id, method, params };\r\n    let raw = JSON.stringify(payload);\r\n    let msg = options?.encrypted === false ? raw : await CryptoUtils.encrypt(raw, this.secret);\r\n    this.send(msg);\r\n\r\n    return new Promise((resolve, reject) => {\r\n      const cleanUp = (): void => {\r\n        clearTimeout(timeoutId);\r\n        options.signal?.removeEventListener('abort', onAbort);\r\n        this.pending.delete(id);\r\n      };\r\n\r\n      const onAbort = (): void => {\r\n        cleanUp();\r\n        reject(new JsonRpcError(JsonRpcErrorCode.RequestCancelled, 'Request was cancelled.'));\r\n      };\r\n\r\n      const timeoutId = setTimeout(() => {\r\n        cleanUp();\r\n        reject(new JsonRpcError(JsonRpcErrorCode.RequestTimeout, 'Request timeout.'));\r\n      }, options.timeout);\r\n\r\n      // If already aborted, cancel immediately\r\n      if (options?.signal?.aborted) {\r\n        onAbort();\r\n        return;\r\n      }\r\n      options.signal?.addEventListener('abort', onAbort);\r\n\r\n      this.pending.set(id, {\r\n        resolve: (result: T) => {\r\n          cleanUp();\r\n          resolve(result);\r\n        },\r\n        reject: (err: JsonRpcError) => {\r\n          cleanUp();\r\n          reject(err);\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  public async notify(method: string, params: JsonRpcParams, encrypted = true): Promise<void> {\r\n    let payload: JsonRpcNotification = { jsonrpc: '2.0', method, params };\r\n    let raw = JSON.stringify(payload);\r\n    let msg = encrypted ? await CryptoUtils.encrypt(raw, this.secret) : raw;\r\n    this.send(msg);\r\n  }\r\n\r\n  public on(method: string, handler: RpcHandler): void {\r\n    this.handlers.set(method, handler);\r\n  }\r\n\r\n  public off(method: string): void {\r\n    this.handlers.delete(method);\r\n  }\r\n\r\n  public async handleMessage(raw: string): Promise<void> {\r\n    let msg = JSON.parse(raw);\r\n    if (this.isJsonRpcResponse(msg)) {\r\n      let cb = this.pending.get(msg.id);\r\n      if (cb) {\r\n        this.pending.delete(msg.id);\r\n        if (msg.error) {\r\n          cb.reject(new JsonRpcError(msg.error.code, msg.error.message));\r\n        } else {\r\n          cb.resolve(msg.result);\r\n        }\r\n      }\r\n    } else if (this.isJsonRpcRequest(msg) || this.isJsonRpcNotification(msg)) {\r\n      let handler = this.handlers.get(msg.method);\r\n      if (handler) {\r\n        let { result, error } = await this.processMessage(msg, handler);\r\n        if (!this.isJsonRpcRequest(msg)) {\r\n          return; // Notifications do not require a response\r\n        }\r\n\r\n        if (!result && !error) {\r\n          error = { code: JsonRpcErrorCode.InvalidResponse, message: \"Handler returned neither result nor error\" };\r\n        }\r\n        let response: JsonRpcResponse = { jsonrpc: '2.0', id: msg.id, result, error };\r\n        let encrypted = await CryptoUtils.encrypt(JSON.stringify(response), this.secret);\r\n        this.send(encrypted);\r\n      }\r\n    }\r\n  }\r\n\r\n  private async processMessage(msg: JsonRpcRequest | JsonRpcNotification, handler: RpcHandler): Promise<{ result?: any; error?: JsonRpcErrorData }> {\r\n    let result, error: JsonRpcErrorData | undefined;\r\n    try {\r\n      if (Array.isArray(msg.params)) {\r\n        result = await handler(...msg.params);\r\n      } else if (msg.params && typeof msg.params === 'object') {\r\n        result = await handler(msg.params);\r\n      } else {\r\n        result = await handler(); // handles undefined/null\r\n      }\r\n\r\n      if (this.isJsonRpcErrorData(result)) {\r\n        error = { code: result.code, message: result.message };\r\n        result = undefined;\r\n      }\r\n    } catch (err) {\r\n      if (this.isJsonRpcErrorData(err)) {\r\n        error = { code: err.code, message: err.message };\r\n      } else {\r\n        error = { code: JsonRpcErrorCode.RequestFailed, message: `Request failed. ${err instanceof Error ? err.message : ''}` };\r\n      }\r\n    }\r\n  \r\n    return { result, error };\r\n  }\r\n\r\n  private isJsonRpcResponse(msg: unknown): msg is JsonRpcResponse {\r\n    return (\r\n      typeof msg === 'object' && msg !== null &&\r\n      'jsonrpc' in msg && msg.jsonrpc === '2.0' &&\r\n      'id' in msg &&\r\n      ('result' in msg || 'error' in msg)\r\n    );\r\n  }\r\n\r\n  private isJsonRpcRequest(msg: unknown): msg is JsonRpcRequest {\r\n    return (\r\n      typeof msg === 'object' && msg !== null &&\r\n      'jsonrpc' in msg && msg.jsonrpc === '2.0' &&\r\n      'id' in msg &&\r\n      'method' in msg\r\n    );\r\n  }\r\n\r\n  private isJsonRpcNotification(msg: unknown): msg is JsonRpcNotification {\r\n    return (\r\n      typeof msg === 'object' && msg !== null &&\r\n      'jsonrpc' in msg && msg.jsonrpc === '2.0' &&\r\n      'method' in msg &&\r\n      !('id' in msg)\r\n    );\r\n  }\r\n\r\n  private isJsonRpcErrorData(data: unknown): data is JsonRpcErrorData {\r\n    return (\r\n      typeof data === 'object' && data !== null &&\r\n      'code' in data && typeof data.code === 'number' &&\r\n      'message' in data && typeof data.message === 'string'\r\n    );\r\n  }\r\n}","export default class CryptoUtils {\r\n\r\n  private static encoder = new TextEncoder();\r\n  private static decoder = new TextDecoder();\r\n\r\n  public static generateSecret(): string {\r\n    let array = new Uint8Array(16);\r\n    crypto.getRandomValues(array);\r\n    return Array.from(array)\r\n      .map(b => b.toString(16).padStart(2, '0'))\r\n      .join('');\r\n  }\r\n\r\n  public static async encrypt(message: string, secret: string): Promise<string> {\r\n    let salt = crypto.getRandomValues(new Uint8Array(16));\r\n    let iv = crypto.getRandomValues(new Uint8Array(12));\r\n    let key = await this.deriveKey(secret, salt);\r\n\r\n    let encodedMessage = this.encoder.encode(message);\r\n    let ciphertext = await crypto.subtle.encrypt(\r\n      {\r\n        name: 'AES-GCM',\r\n        iv,\r\n      },\r\n      key,\r\n      encodedMessage\r\n    );\r\n\r\n    let combined = this.concatBuffers([salt, iv, new Uint8Array(ciphertext)]);\r\n    return this.base64Encode(combined);\r\n  }\r\n\r\n  public static async decrypt(encMessage: string, secret: string): Promise<string> {\r\n    let data = this.base64Decode(encMessage);\r\n    let salt = data.slice(0, 16);\r\n    let iv = data.slice(16, 28);\r\n    let ciphertext = data.slice(28);\r\n\r\n    let key = await this.deriveKey(secret, salt);\r\n\r\n    let decrypted = await crypto.subtle.decrypt(\r\n      {\r\n        name: 'AES-GCM',\r\n        iv,\r\n      },\r\n      key,\r\n      ciphertext\r\n    );\r\n\r\n    return this.decoder.decode(decrypted);\r\n  }\r\n\r\n  private static async deriveKey(secret: string, salt: Uint8Array<ArrayBuffer>): Promise<CryptoKey> {\r\n    let encodedSecret = this.encoder.encode(secret);\r\n    let baseKey = await crypto.subtle.importKey(\r\n      'raw',\r\n      encodedSecret,\r\n      'PBKDF2',\r\n      false,\r\n      ['deriveKey']\r\n    );\r\n\r\n    return crypto.subtle.deriveKey(\r\n      {\r\n        name: 'PBKDF2',\r\n        salt,\r\n        iterations: 100_000,\r\n        hash: 'SHA-256',\r\n      },\r\n      baseKey,\r\n      {\r\n        name: 'AES-GCM',\r\n        length: 256,\r\n      },\r\n      false,\r\n      ['encrypt', 'decrypt']\r\n    );\r\n  }\r\n\r\n  private static concatBuffers(buffers: Uint8Array[]): Uint8Array {\r\n    let totalLength = buffers.reduce((sum, b) => sum + b.length, 0);\r\n    let result = new Uint8Array(totalLength);\r\n    let offset = 0;\r\n    for (let b of buffers) {\r\n      result.set(b, offset);\r\n      offset += b.length;\r\n    }\r\n    return result;\r\n  }\r\n\r\n  private static base64Encode(data: Uint8Array): string {\r\n    return btoa(String.fromCharCode(...data));\r\n  }\r\n\r\n  private static base64Decode(b64: string): Uint8Array {\r\n    let binary = atob(b64);\r\n    let len = binary.length;\r\n    let bytes = new Uint8Array(len);\r\n    for (let i = 0; i < len; i++) {\r\n      bytes[i] = binary.charCodeAt(i);\r\n    }\r\n    return bytes;\r\n  }\r\n}","export enum JsonRpcErrorCode {\r\n  // Standard JSON-RPC error codes\r\n  ParseError = -32700,\r\n  InvalidRequest = -32600,\r\n  MethodNotFound = -32601,\r\n  InvalidParams = -32602,\r\n  InternalError = -32603,\r\n\r\n  // Custom error codes\r\n  RequestFailed = -32000,\r\n  RequestCancelled = -32001,\r\n  RequestRejected = -32003,\r\n  SessionNotFound = -32004,\r\n  RequestTimeout = -32008,\r\n  SessionConflict = -32009,\r\n  ConnectionClosed = -32010,\r\n  InvalidResponse = -32052,\r\n}\r\n\r\nexport class JsonRpcError extends Error {\r\n\r\n  constructor(public readonly code: number, message: string) {\r\n    super(message);\r\n    this.name = \"JsonRpcError\";\r\n  }\r\n}","import type { DAppInfo, TransactionRecipient, AccountDetails } from \"../types\";\nimport CryptoUtils from \"../utils/crypto-utils\";\nimport PeerProvider from \"./peer-provider\";\n\n/**\n * A provider for dApps to connect with wallet applications.\n * \n * This class is used by a dApp to create a session and interact with a wallet.\n * @example\n * ```typescript\n * // dApp-side implementation\n * const provider = new WalletProvider(\"wss://relay.example.com\", {\n *   name: \"My Awesome dApp\",\n *   description: \"This is a dApp.\",\n *   url: \"https://dapp.example.com\",\n *   icon: \"https://dapp.example.com/icon.png\"\n * });\n *\n * await provider.connect();\n * await provider.createSession();\n * const uri = provider.getPairingURI();\n * // Display the URI as a QR code for the wallet to scan.\n *\n * const walletAddress = await provider.waitForWallet();\n * console.log(\"Wallet connected:\", walletAddress);\n *\n * const signedMessage = await provider.signMessage(walletAddress, \"Hello, Wallet!\");\n * console.log(\"Signed message:\", signedMessage);\n * ```\n */\nexport default class WalletProvider extends PeerProvider {\n\n  private walletWaiterHandler?: (address: string) => void;\n  private walletWaiterAbortController?: AbortController;\n\n  private walletJoinedHandler?: (address: string) => void;\n\n  /**\n   * Creates an instance of WalletProvider.\n   * \n   * @param relayUrl - The URL of the relay server.\n   * @param appInfo - Information about the dApp.\n   * @param version - The protocol version. Default is \"1\".\n   * @param secret - The session secret. Default is new generated secret.\n   * @param sessionId - The session id if already exist. Default is empty string.\n   */\n  constructor(relayUrl: string, private appInfo: DAppInfo, version = \"1\", secret = CryptoUtils.generateSecret(), sessionId = \"\") {\n    super(version, relayUrl, secret, sessionId);\n    this.on('wl_sessionJoined', (address) => this.handleWalletJoined(address));\n  }\n\n  /**\n   * Creates a new session.\n   * \n   * @param timeoutMs - The connection timeout in milliseconds. Default is 10,000ms.\n   * @returns A promise that resolves when the session is created.\n   * @throws If the session creation fails.\n   */\n  public async createSession(timeoutMs = 10_000): Promise<void> {\n    let sessionId = await this.sendRequest('wl_createSession', [this.appInfo], { encrypted: false, timeout: timeoutMs });\n    if (typeof sessionId !== 'string') {\n      throw new Error('Invalid session ID received from relay');\n    }\n    this.sessionId = sessionId;\n  }\n\n  /**\n   * Rejoin a session.\n   * \n   * @param timeoutMs - The request timeout in milliseconds. Default 10_000ms\n   * @returns A promise that resolves to true if joined successfully.\n   * @throws If the operation fails.\n   */\n  public async rejoinSession(timeoutMs = 10_000): Promise<boolean> {\n    let success = await this.sendRequest<boolean>(\"wl_joinSession\", [this.sessionId, \"app\"], { encrypted: false, timeout: timeoutMs });\n    if (!success) {\n      throw new Error(\"Failed to join session\");\n    }\n\n    return success;\n  }\n\n  /**\n   * Disconnects from the relay server and cancels any pending wallet connection waits.\n   */\n  public override disconnect(): void {\n    this.cancelWaitForWallet();\n    super.disconnect();\n  }\n\n  /**\n   * Gets the pairing URI for the current session.\n   * \n   * This URI should be displayed as a QR code for the wallet to scan.\n   * \n   * @returns The pairing URI.\n   */\n  public getPairingURI(): string {\n    return `wl:${this.version}@${this.relayUrl}?session=${this.sessionId}&secret=${this.secret}`;\n  }\n\n  /**\n   * Waits for a wallet to join the session.\n   * \n   * @param timeoutMs - The timeout in milliseconds to wait for the wallet. Default is 30,000ms.\n   * @returns A promise that resolves with the wallet's address.\n   * @throws If the operation times out or is canceled.\n   */\n  public waitForWallet(timeoutMs = 30_000): Promise<string> {\n    if (this.walletWaiterAbortController) {\n      throw new Error('Already waiting for wallet');\n    }\n\n    this.walletWaiterAbortController = new AbortController();\n    let { signal } = this.walletWaiterAbortController;\n\n    return new Promise((resolve, reject) => {\n      let timer = setTimeout(() => {\n        cleanup();\n        reject(new Error('Wallet connection timeout'));\n      }, timeoutMs);\n\n      const handler = (address: string): void => {\n        cleanup();\n        resolve(address);\n      };\n\n      const cleanup = (): void => {\n        clearTimeout(timer);\n        this.walletWaiterHandler = undefined;\n        this.walletWaiterAbortController = undefined;\n      };\n\n      this.walletWaiterHandler = handler;\n\n      signal.addEventListener('abort', () => {\n        cleanup();\n        reject(new Error('Wallet wait canceled'));\n      });\n    });\n  }\n\n  /**\n   * Cancels the wait for a wallet to connect.\n   */\n  public cancelWaitForWallet(): void {\n    this.walletWaiterAbortController?.abort();\n  }\n\n  /**\n   * Registers a handler for when a wallet joins the session.\n   *\n   * @param handler - The function to handle the wallet join event.\n   */\n  public onWalletJoin(handler: (address: string) => Promise<void> | void): void {\n    this.walletJoinedHandler = handler;\n  }\n\n  private handleWalletJoined(address: string): void {\n    if (this.walletWaiterHandler) {\n      this.walletWaiterHandler(address);\n    } else if (this.walletJoinedHandler) {\n      this.walletJoinedHandler(address);\n    }\n  }\n\n  /**\n   * Requests the connected wallet to sign a message.\n   * \n   * @param account - The account address to use for signing.\n   * @param message - The message to sign - as utf8 string hex representation.\n   * @param timeoutMs - The request timeout in milliseconds. Default is 30,000ms.\n   * @param signal - An AbortSignal to cancel the request.\n   * @returns A promise that resolves with the signed message.\n   * @throws If the wallet is not connected or the request fails.\n   */\n  public signMessage(account: string, message: string, timeoutMs = 30_000, signal?: AbortSignal): Promise<string> {\n    if (!this.sessionId) {\n      throw new Error('Not connected to a wallet');\n    }\n    return this.sendRequest('wallet_signMessage', { account, message }, { timeout: timeoutMs, signal });\n  }\n\n  /**\n   * Requests the connected wallet to add a token to its tokens list.\n   * \n   * @param account - The account address.\n   * @param token - The token identifier to add.\n   * @param timeoutMs - The request timeout in milliseconds. Default is 30,000ms.\n   * @param signal - An AbortSignal to cancel the request.\n   * @returns A promise that resolves to true if the token was added successfully.\n   * @throws If the wallet is not connected or the request fails.\n   */\n  public addToken(account: string, token: string, timeoutMs = 30_000, signal?: AbortSignal): Promise<boolean> {\n    if (!this.sessionId) {\n      throw new Error('Not connected to a wallet');\n    }\n    return this.sendRequest('wallet_addToken', { account, token }, { timeout: timeoutMs, signal });\n  }\n\n  /**\n   * Requests the connected wallet to sign a transaction.\n   *\n   * @param account - The account address to use for signing.\n   * @param hex - The transaction hex to sign.\n   * @param broadcast - Whether to broadcast the transaction after signing.\n   * @param timeoutMs - The request timeout in milliseconds. Default is 30,000ms.\n   * @param signal - An AbortSignal to cancel the request.\n   * @returns A promise that resolves with the signed transaction hex, or transaction ID if broadcast is `true`.\n   * @throws If the wallet is not connected or the request fails.\n   */\n  public signTransaction(account: string, hex: string, broadcast?: boolean, timeoutMs = 30_000, signal?: AbortSignal): Promise<string> {\n    if (!this.sessionId) {\n      throw new Error('Not connected to a wallet');\n    }\n    return this.sendRequest('wallet_signTransaction', { account, hex, broadcast }, { timeout: timeoutMs, signal });\n  }\n\n /**\n   * Requests the connected wallet to send a transaction.\n   *\n   * @param from - The sender's address.\n   * @param to - The recipient and amount.\n   * @param data - Optional data to include in the transaction.\n   * @param timeoutMs - The request timeout in milliseconds. Default is 30,000ms.\n   * @param signal - An AbortSignal to cancel the request.\n   * @returns A promise that resolves with the transaction ID.\n   * @throws If the wallet is not connected or the request fails.\n   */\n   public sendTransaction(from: string, to: TransactionRecipient, data?: string, timeoutMs = 30_000, signal?: AbortSignal): Promise<string> {\n     if (!this.sessionId) {\n       throw new Error('Not connected to a wallet');\n     }\n     return this.sendRequest('wallet_sendTransaction', { from, to, data }, { timeout: timeoutMs, signal });\n   }\n\n  /**\n   * Requests the connected wallet to return the current account details.\n   *\n   * @param timeoutMs - The request timeout in milliseconds. Default is 30,000ms.\n   * @param signal - An AbortSignal to cancel the request.\n   * @returns A promise that resolves with the account details.\n   * @throws If the wallet is not connected or the request fails.\n   */\n  public getAccount(timeoutMs = 30_000, signal?: AbortSignal): Promise<AccountDetails> {\n    if (!this.sessionId) {\n      throw new Error('Not connected to a wallet');\n    }\n    return this.sendRequest('wallet_getAccount', undefined, { timeout: timeoutMs, signal });\n  }\n}"],"names":[],"version":3,"file":"index.cjs.map"}