SHA256
ESP32 wallet RPC, browser wallet provider, and side panel
This commit is contained in:
@@ -24,6 +24,7 @@ export class WsJsonClient {
|
||||
this.ws = null;
|
||||
this.openPromise = null;
|
||||
this.pending = new Map();
|
||||
this.listeners = new Map();
|
||||
}
|
||||
|
||||
async open() {
|
||||
@@ -78,14 +79,53 @@ export class WsJsonClient {
|
||||
} catch {
|
||||
return;
|
||||
}
|
||||
if (data?.event) {
|
||||
this.emit(String(data?.op || ''), data);
|
||||
return;
|
||||
}
|
||||
const requestId = data?.requestId;
|
||||
if (!requestId) return;
|
||||
if (!requestId) {
|
||||
this.emit(String(data?.op || ''), data);
|
||||
return;
|
||||
}
|
||||
const slot = this.pending.get(requestId);
|
||||
if (!slot) return;
|
||||
if (!slot) {
|
||||
this.emit(String(data?.op || ''), data);
|
||||
return;
|
||||
}
|
||||
this.pending.delete(requestId);
|
||||
slot.resolve(data);
|
||||
}
|
||||
|
||||
on(op, handler) {
|
||||
const key = String(op || '').trim();
|
||||
if (!key || typeof handler !== 'function') {
|
||||
return () => {};
|
||||
}
|
||||
if (!this.listeners.has(key)) {
|
||||
this.listeners.set(key, new Set());
|
||||
}
|
||||
this.listeners.get(key).add(handler);
|
||||
return () => {
|
||||
const bucket = this.listeners.get(key);
|
||||
if (!bucket) return;
|
||||
bucket.delete(handler);
|
||||
if (!bucket.size) {
|
||||
this.listeners.delete(key);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
emit(op, payload) {
|
||||
const bucket = this.listeners.get(String(op || '').trim());
|
||||
if (!bucket?.size) return;
|
||||
for (const handler of [...bucket]) {
|
||||
try {
|
||||
handler(payload);
|
||||
} catch {}
|
||||
}
|
||||
}
|
||||
|
||||
failPending(message) {
|
||||
const error = new Error(message);
|
||||
for (const slot of this.pending.values()) slot.reject(error);
|
||||
|
||||
Reference in New Issue
Block a user