2022-07-20 07:36:21 +00:00
|
|
|
const RPC_MODULE = "AQDaEPIo_lpdvz7AKbeafERBHR331RiyvweJ6OrFTplzyg";
|
|
|
|
let callModule, connectModule;
|
2022-07-21 04:58:47 +00:00
|
|
|
async function loadLibs() {
|
|
|
|
if (callModule && connectModule) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (typeof window !== "undefined" && window?.document) {
|
|
|
|
const pkg = await import("libkernel");
|
|
|
|
callModule = pkg.callModule;
|
|
|
|
connectModule = pkg.connectModule;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
const pkg = await import("libkmodule");
|
|
|
|
callModule = pkg.callModule;
|
|
|
|
connectModule = pkg.connectModule;
|
|
|
|
}
|
2022-07-20 07:36:21 +00:00
|
|
|
}
|
|
|
|
export class RpcNetwork {
|
|
|
|
_actionQueue = [];
|
2022-07-21 04:58:47 +00:00
|
|
|
_addQueue = [];
|
|
|
|
_removeQueue = [];
|
2022-07-20 07:36:21 +00:00
|
|
|
get ready() {
|
2022-07-21 04:58:47 +00:00
|
|
|
return loadLibs().then(() => callModule(RPC_MODULE, "ready"));
|
2022-07-20 07:36:21 +00:00
|
|
|
}
|
|
|
|
addRelay(pubkey) {
|
2022-07-21 04:58:47 +00:00
|
|
|
this._addQueue.push(pubkey);
|
|
|
|
this._addQueue = [...new Set(this._addQueue)];
|
|
|
|
RpcNetwork.deleteItem(this._removeQueue, pubkey);
|
2022-07-20 07:36:21 +00:00
|
|
|
}
|
|
|
|
removeRelay(pubkey) {
|
2022-07-21 04:58:47 +00:00
|
|
|
this._removeQueue.push(pubkey);
|
|
|
|
this._removeQueue = [...new Set(this._removeQueue)];
|
|
|
|
RpcNetwork.deleteItem(this._addQueue, pubkey);
|
2022-07-20 07:36:21 +00:00
|
|
|
}
|
|
|
|
clearRelays() {
|
2022-07-21 04:58:47 +00:00
|
|
|
this._actionQueue.push(["clearRelays", {}]);
|
|
|
|
}
|
|
|
|
static deleteItem(array, item) {
|
|
|
|
if (array.includes(item)) {
|
|
|
|
let queue = new Set(array);
|
|
|
|
queue.delete(item);
|
|
|
|
array = [...queue];
|
|
|
|
}
|
2022-07-20 07:36:21 +00:00
|
|
|
}
|
|
|
|
query(query, chain, data = {}, force = false) {
|
|
|
|
return new RpcQuery(this, {
|
|
|
|
query,
|
|
|
|
chain,
|
|
|
|
data,
|
|
|
|
force: force,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
async processQueue() {
|
2022-07-21 04:58:47 +00:00
|
|
|
await loadLibs();
|
|
|
|
for (const action of this._actionQueue) {
|
2022-07-20 08:45:36 +00:00
|
|
|
try {
|
2022-07-21 04:58:47 +00:00
|
|
|
await callModule(RPC_MODULE, action[0], action[1]);
|
2022-07-20 08:45:36 +00:00
|
|
|
}
|
2022-07-20 21:22:25 +00:00
|
|
|
catch (e) { }
|
2022-07-20 08:45:36 +00:00
|
|
|
}
|
2022-07-21 04:58:47 +00:00
|
|
|
await Promise.allSettled(this._removeQueue.map((item) => callModule(RPC_MODULE, "removeRelay", { pubkey: item })));
|
|
|
|
await Promise.allSettled(this._addQueue.map((item) => callModule(RPC_MODULE, "addRelay", { pubkey: item })));
|
2022-07-20 07:36:21 +00:00
|
|
|
this._actionQueue = [];
|
2022-07-21 04:58:47 +00:00
|
|
|
this._removeQueue = [];
|
|
|
|
this._addQueue = [];
|
2022-07-20 07:36:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
export class RpcQuery {
|
|
|
|
_promise;
|
|
|
|
constructor(network, query) {
|
|
|
|
this._promise = network
|
|
|
|
.processQueue()
|
|
|
|
.then(() => callModule(RPC_MODULE, "query", query));
|
|
|
|
}
|
|
|
|
get result() {
|
|
|
|
return this._promise.then((result) => {
|
|
|
|
if (result[1]) {
|
|
|
|
throw new Error(result[1]);
|
|
|
|
}
|
|
|
|
return result[0];
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|