relay-plugin-eth/src/index.ts

63 lines
1.4 KiB
TypeScript

import type { Plugin, PluginAPI } from "@lumeweb/interface-relay";
import fetch, { Request, RequestInit } from "node-fetch";
const EXECUTION_RPC_URL =
"https://g.w.lavanet.xyz:443/gateway/eth/rpc-http/f195d68175eb091ec1f71d00f8952b85";
const CONSENSUS_RPC_URL = "https://www.lightclientdata.org";
async function doFetch(url: string, request: RequestInit) {
sanitizeRequestArgs(request);
let req = new Request(url, request);
const resp = await fetch(req);
return (await resp.json()) as any;
}
function sanitizeRequestArgs(request: RequestInit) {
if (!request || typeof request !== "object") {
throw Error("invalid request");
}
[
"agent",
"hostname",
"referrer",
"referrerPolicy",
"compress",
"port",
"protocol",
"hostname",
"insecureHTTPParser",
"highWaterMark",
"size",
].forEach((element) => {
if (element in request) {
delete request[element];
}
});
}
const plugin: Plugin = {
name: "eth",
async plugin(api: PluginAPI): Promise<void> {
api.registerMethod("execution_request", {
cacheable: false,
async handler(request: RequestInit): Promise<object> {
return doFetch(EXECUTION_RPC_URL, request);
},
});
api.registerMethod("consensus_request", {
cacheable: false,
async handler(request: RequestInit): Promise<object> {
return doFetch(CONSENSUS_RPC_URL, request);
},
});
},
};
export default plugin;