63 lines
1.4 KiB
TypeScript
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;
|