UNPKG

js-moi-providers

Version:

Module to connect and interact with MOI network

91 lines (77 loc) 2.72 kB
import fetch from "cross-fetch"; import { CustomError, ErrorCode, ErrorUtils } from "js-moi-utils"; import { RpcResponse } from "../types/jsonrpc"; import { BaseProvider } from "./base-provider"; /** * A class that represents a JSON-RPC provider for making RPC calls over HTTP. */ export class JsonRpcProvider extends BaseProvider { protected host: string; constructor(host: string) { super(); if(/^http(s)?:\/\//i.test(host) || /^ws(s)?:\/\//i.test(host)) { this.host = host return } ErrorUtils.throwError("Invalid request url!", ErrorCode.INVALID_ARGUMENT) } /** * Executes an RPC call by sending a method and parameters. * * @param method - The method to call. * @param params - The parameters for the method call. * @returns A Promise that resolves to the result of the RPC call. * @throws Error if there is an error executing the RPC call. */ protected async execute<T>(method: string, params: any): Promise<RpcResponse<T>> { try { return await this.send(method, [params]) } catch (error) { throw error } } /** * Sends an RPC request to the JSON-RPC endpoint. * * @param method - The method to call. * @param params - The parameters for the method call. * @returns A Promise that resolves to the result of the RPC call. * @throws Error if there is an error sending the RPC request. */ protected async send<T>(method: string, params: any[]): Promise<RpcResponse<T>> { try { const payload = { method: method, params: params, jsonrpc: "2.0", id: 1 }; const response = await fetch(this.host, { method: 'POST', body: JSON.stringify(payload), headers: { 'Content-Type': 'application/json' } }); if (!response.ok) { const errMessage = await response.text(); if (this.isServerError(response)) { ErrorUtils.throwError( `Error: ${errMessage}`, ErrorCode.SERVER_ERROR ) } throw new Error(errMessage) } return await response.json() } catch(error) { if(error instanceof CustomError) { throw error; } ErrorUtils.throwError( `Error: ${error.message}`, ErrorCode.NETWORK_ERROR ) } } }