relay-plugin-handshake/src/index.ts

117 lines
2.6 KiB
TypeScript

import type {
Plugin,
PluginAPI,
RPCResponse,
RPCRequest,
} from "@lumeweb/relay";
// @ts-ignore
import rand from "random-key";
// @ts-ignore
import SPVNode from "hsd/lib/node/spvnode.js";
// @ts-ignore
import { NodeClient } from "hs-client";
async function boot(config: any) {
let hsdServer: SPVNode;
let clientArgs = {
network: "main",
host: "127.0.0.1",
port: 12037,
apiKey: rand.generate(),
};
if (!config.bool("hsd-use-external-node")) {
hsdServer = new SPVNode({
config: false,
argv: false,
env: true,
noDns: true,
memory: false,
httpHost: "127.0.0.1",
apiKey: clientArgs.apiKey,
logFile: false,
logConsole: true,
logLevel: "info",
workers: true,
network: "main",
});
hsdServer.on("abort", async (err: any) => {
const timeout = setTimeout(() => {
console.error("Shutdown is taking a long time. Exiting.");
process.exit(3);
}, 5000);
timeout.unref();
try {
console.error("Shutting down...");
await hsdServer.close();
clearTimeout(timeout);
console.error((err as Error).stack);
process.exit(2);
} catch (e: any) {
console.error(
`Error occurred during shutdown: ${(e as Error).message}`
);
process.exit(3);
}
});
(async () => {
try {
await hsdServer.ensure();
await hsdServer.open();
await hsdServer.connect();
hsdServer.startSync();
} catch (e: any) {
console.error((e as Error).stack);
}
})();
} else {
clientArgs = {
network: config.str("hsd-network-type"),
host: config.str("hsd-host"),
port: config.uint("hsd-port"),
apiKey: config.str("hsd-api-key"),
};
}
return new NodeClient(clientArgs);
}
const plugin: Plugin = {
name: "handshake",
async plugin(api: PluginAPI): Promise<void> {
const client = await boot(api.config);
api.registerMethod("getnameresource", {
cacheable: true,
async handler(request: RPCRequest): Promise<RPCResponse> {
let resp;
try {
resp = await client.execute("getnameresource", request.data);
} catch (e: any) {
e = e as Error;
const eType = e.type.toLowerCase();
const eMessage = e.message.toLowerCase();
if (
eType === "rpcerror" &&
eMessage.includes("chain is not synced")
) {
throw new Error("NOT_READY");
}
throw e;
}
return resp;
},
});
},
};
export default plugin;