63 lines
1.8 KiB
JavaScript
63 lines
1.8 KiB
JavaScript
import b4a from "b4a";
|
|
import { hashQuery, isPromise, validateTimestampedResponse, } from "../util.js";
|
|
import RPC from "@lumeweb/rpc";
|
|
import { ERR_INVALID_SIGNATURE } from "../error.js";
|
|
import RpcQueryBase from "./base.js";
|
|
export default class SimpleRpcQuery extends RpcQueryBase {
|
|
_relay;
|
|
constructor(network, relay, query, options) {
|
|
super(network, query, options);
|
|
this._relay = relay;
|
|
}
|
|
async _run() {
|
|
await this.queryRelay();
|
|
await this.checkResponses();
|
|
}
|
|
async queryRelay() {
|
|
let socket;
|
|
try {
|
|
socket = this._network.dht.connect(b4a.from(this._relay, "hex"));
|
|
if (isPromise(socket)) {
|
|
socket = await socket;
|
|
}
|
|
}
|
|
catch (e) {
|
|
return;
|
|
}
|
|
await socket.opened;
|
|
const rpc = new RPC(socket);
|
|
if (this._query.bypassCache) {
|
|
delete this._query.bypassCache;
|
|
await this.queryRpc(rpc, {
|
|
module: "rpc",
|
|
method: "clear_cached_item",
|
|
data: hashQuery(this._query),
|
|
});
|
|
}
|
|
if ("bypassCache" in this._query) {
|
|
delete this._query.bypassCache;
|
|
}
|
|
try {
|
|
await this.queryRpc(rpc, this._query);
|
|
}
|
|
catch (e) {
|
|
// @ts-ignore
|
|
rpc.end();
|
|
throw e;
|
|
}
|
|
// @ts-ignore
|
|
rpc.end();
|
|
}
|
|
async checkResponses() {
|
|
let response = this._response;
|
|
if (this._error) {
|
|
response = { error: this._error };
|
|
}
|
|
if (!response.error &&
|
|
!validateTimestampedResponse(b4a.from(this._relay, "hex"), response)) {
|
|
response = { error: ERR_INVALID_SIGNATURE };
|
|
}
|
|
this.resolve(response);
|
|
}
|
|
}
|