2022-07-20 07:35:58 +00:00
|
|
|
import { ErrTuple } from "libskynet";
|
2023-03-23 16:42:21 +00:00
|
|
|
import type {
|
|
|
|
RPCRequest,
|
|
|
|
RPCResponse,
|
|
|
|
ClientRPCRequest,
|
|
|
|
} from "@lumeweb/interface-relay";
|
|
|
|
import { RpcQueryOptions } from "@lumeweb/rpc-client";
|
2022-08-31 01:39:26 +00:00
|
|
|
import { Buffer } from "buffer";
|
2023-03-23 16:42:21 +00:00
|
|
|
import { Client } from "@lumeweb/libkernel-universal";
|
2022-07-20 07:35:58 +00:00
|
|
|
|
2023-03-23 16:42:21 +00:00
|
|
|
const RPC_MODULE = "PAMz6NHrYRxDqQ-Am5HW_l0tBHouFBCbMXjnnjurJLXpTQ";
|
2022-07-20 07:35:58 +00:00
|
|
|
|
2023-03-23 16:42:21 +00:00
|
|
|
export class RpcNetwork extends Client {
|
2022-07-21 04:58:24 +00:00
|
|
|
private _actionQueue: [string, any][] = [];
|
|
|
|
private _addQueue: string[] = [];
|
|
|
|
private _removeQueue: string[] = [];
|
2022-08-31 18:42:26 +00:00
|
|
|
private _def: boolean;
|
|
|
|
|
|
|
|
constructor(def: boolean = true) {
|
2023-03-23 16:42:21 +00:00
|
|
|
super();
|
2022-08-31 18:42:26 +00:00
|
|
|
this._def = def;
|
|
|
|
}
|
|
|
|
|
|
|
|
private _networkId: number = 0;
|
|
|
|
|
|
|
|
get networkId(): number {
|
|
|
|
return this._networkId;
|
|
|
|
}
|
2022-07-20 07:35:58 +00:00
|
|
|
|
|
|
|
get ready(): Promise<ErrTuple> {
|
2022-08-31 18:42:26 +00:00
|
|
|
if (this._def) {
|
2022-08-31 19:25:18 +00:00
|
|
|
this._networkId = 1;
|
2022-08-31 18:42:26 +00:00
|
|
|
} else {
|
2023-03-23 16:42:21 +00:00
|
|
|
Promise.resolve()
|
|
|
|
.then(() => this.callModuleReturn(RPC_MODULE, "createNetwork"))
|
2022-08-31 18:42:26 +00:00
|
|
|
.then((ret: ErrTuple) => (this._networkId = ret[0]));
|
|
|
|
}
|
|
|
|
|
2023-03-23 16:42:21 +00:00
|
|
|
return this.callModuleReturn("ready", {
|
|
|
|
network: this._networkId,
|
|
|
|
});
|
2022-08-31 01:39:26 +00:00
|
|
|
}
|
|
|
|
public simpleQuery(
|
|
|
|
relay: Buffer | string,
|
2023-03-23 16:42:21 +00:00
|
|
|
query: ClientRPCRequest,
|
2022-08-31 01:39:26 +00:00
|
|
|
data: object | any[] = {},
|
|
|
|
options: RpcQueryOptions = {}
|
|
|
|
): SimpleRpcQuery {
|
2023-03-23 16:42:21 +00:00
|
|
|
return new SimpleRpcQuery({
|
|
|
|
network: this,
|
2022-08-31 01:39:26 +00:00
|
|
|
relay,
|
2023-03-23 16:42:21 +00:00
|
|
|
query,
|
|
|
|
options,
|
|
|
|
}).run();
|
2022-07-20 07:35:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-03-23 16:42:21 +00:00
|
|
|
export abstract class RpcQueryBase extends Client {
|
2022-08-31 01:39:26 +00:00
|
|
|
protected _promise?: Promise<any>;
|
|
|
|
protected _network: RpcNetwork;
|
|
|
|
protected _query: RPCRequest;
|
|
|
|
protected _options: RpcQueryOptions;
|
|
|
|
protected _queryType: string;
|
|
|
|
|
|
|
|
constructor(
|
|
|
|
network: RpcNetwork,
|
|
|
|
query: RPCRequest,
|
|
|
|
options: RpcQueryOptions = {},
|
|
|
|
queryType: string
|
|
|
|
) {
|
2023-03-23 16:42:21 +00:00
|
|
|
super();
|
2022-08-31 01:39:26 +00:00
|
|
|
this._network = network;
|
|
|
|
this._query = query;
|
|
|
|
this._options = options;
|
|
|
|
this._queryType = queryType;
|
|
|
|
}
|
2022-07-20 07:35:58 +00:00
|
|
|
|
2022-08-31 18:42:26 +00:00
|
|
|
get result(): Promise<RPCResponse> {
|
2023-03-23 16:42:21 +00:00
|
|
|
return (this._promise as Promise<any>)
|
|
|
|
.then((result: ErrTuple): RPCResponse => {
|
|
|
|
return result[0];
|
|
|
|
})
|
|
|
|
.catch((error: Error) => {
|
|
|
|
return { error: error.message };
|
|
|
|
});
|
2022-08-31 18:42:26 +00:00
|
|
|
}
|
|
|
|
|
2022-08-31 01:39:26 +00:00
|
|
|
public run(): this {
|
2023-03-23 16:42:21 +00:00
|
|
|
this._promise = this.callModule(this._queryType, {
|
|
|
|
query: this._query,
|
|
|
|
options: this._options,
|
|
|
|
network: this._network.networkId,
|
|
|
|
});
|
2022-08-31 01:39:26 +00:00
|
|
|
|
|
|
|
return this;
|
2022-07-20 07:35:58 +00:00
|
|
|
}
|
|
|
|
}
|
2022-08-31 01:39:26 +00:00
|
|
|
|
|
|
|
export class SimpleRpcQuery extends RpcQueryBase {
|
2022-08-31 23:23:38 +00:00
|
|
|
protected _relay: string | Buffer;
|
2023-03-23 16:42:21 +00:00
|
|
|
constructor({
|
|
|
|
network,
|
|
|
|
relay,
|
|
|
|
query,
|
|
|
|
options,
|
|
|
|
}: {
|
|
|
|
network: RpcNetwork;
|
|
|
|
relay: string | Buffer;
|
|
|
|
query: RPCRequest;
|
|
|
|
options: RpcQueryOptions;
|
|
|
|
}) {
|
2022-08-31 01:39:26 +00:00
|
|
|
super(network, query, options, "simpleQuery");
|
2022-08-31 21:32:52 +00:00
|
|
|
this._relay = relay;
|
|
|
|
}
|
|
|
|
public run(): this {
|
2023-03-23 16:42:21 +00:00
|
|
|
this._promise = this.callModule(this._queryType, {
|
|
|
|
relay: this._relay,
|
|
|
|
query: this._query,
|
|
|
|
options: this._options,
|
|
|
|
network: this._network.networkId,
|
2022-09-01 00:10:24 +00:00
|
|
|
});
|
2022-08-31 01:39:26 +00:00
|
|
|
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
}
|