2022-12-07 09:24:42 +00:00
|
|
|
import type { Plugin, PluginAPI } from "@lumeweb/relay-types";
|
2022-08-28 17:07:45 +00:00
|
|
|
// @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,
|
2022-12-07 09:24:42 +00:00
|
|
|
async handler(name: string): Promise<any> {
|
2022-08-28 17:07:45 +00:00
|
|
|
let resp;
|
|
|
|
try {
|
2022-12-07 09:24:42 +00:00
|
|
|
resp = await client.execute("getnameresource", name);
|
2022-08-28 17:07:45 +00:00
|
|
|
} 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;
|
|
|
|
}
|
|
|
|
|
2022-12-07 09:24:42 +00:00
|
|
|
return resp;
|
2022-08-28 17:07:45 +00:00
|
|
|
},
|
|
|
|
});
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
export default plugin;
|