kernel-rpc-client/dist/index.js

84 lines
2.5 KiB
JavaScript
Raw Normal View History

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) {
try {
2022-07-21 04:58:47 +00:00
await callModule(RPC_MODULE, action[0], action[1]);
}
2022-07-20 21:22:25 +00:00
catch (e) { }
}
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];
});
}
}