@lodestar/prover
Version:
A Typescript implementation of the Ethereum Consensus light client
66 lines • 2.71 kB
JavaScript
import { ZERO_ADDRESS } from "../constants.js";
import { isRequest, isValidBatchResponse, isValidResponse, logRequest, logResponse, mergeBatchReqResp, } from "./json_rpc.js";
import { isNullish } from "./validation.js";
export class ELRpcProvider {
constructor(handler, logger) {
this.requestId = 0;
this.handler = handler;
this.logger = logger;
}
/**
* Request the EL RPC Provider
*
* @template K
* @template E
* @param {K} method - RPC Method
* @param {ELApiParams[K]} params - RPC Params
* @param {{raiseError?: E}} [opts]
* @return {*} {Promise<E extends false ? JsonRpcResponse<ELApiReturn[K]> : JsonRpcResponseWithResultPayload<ELApiReturn[K]>>}
* @memberof ELRpc
*/
async request(method, params, opts) {
const { raiseError } = opts ?? { raiseError: true };
const payload = { jsonrpc: "2.0", method, params, id: this.getRequestId() };
logRequest(payload, this.logger);
const response = await this.handler(payload);
logResponse(response, this.logger);
if (raiseError && !isValidResponse(response)) {
throw new Error(`Invalid response from RPC. method=${method} params=${JSON.stringify(params)}`);
}
return response;
}
async batchRequest(input, opts) {
const payloads = [];
for (const req of input) {
if (isRequest(req) && isNullish(req.id)) {
payloads.push({ jsonrpc: "2.0", method: req.method, params: req.params, id: this.getRequestId() });
}
else {
payloads.push(req);
}
}
logRequest(payloads, this.logger);
const response = await this.handler(payloads);
logResponse(response, this.logger);
if (isNullish(response)) {
throw new Error("Invalid empty response from server.");
}
if (opts.raiseError && !isValidBatchResponse(payloads, response)) {
throw new Error(`Invalid response from RPC. payload=${JSON.stringify(payloads)} response=${JSON.stringify(response)}}`);
}
return mergeBatchReqResp(payloads, response);
}
async verifyCompatibility() {
try {
await this.request("eth_getProof", [ZERO_ADDRESS, [], "latest"], { raiseError: true });
}
catch (err) {
this.logger.error("Execution compatibility failed.", undefined, err);
throw new Error("RPC does not support 'eth_getProof', which is required for the prover to work properly.");
}
}
getRequestId() {
return (++this.requestId).toString();
}
}
//# sourceMappingURL=rpc_provider.js.map