Merge pull request #7594 from BlueWallet/wrap

REF: Wrap BlueElecrum promises in try catch
This commit is contained in:
GLaDOS 2025-02-14 20:31:10 +00:00 committed by GitHub
commit 115b0a2a4f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -138,6 +138,7 @@ async function _getRealm() {
}
export const getPreferredServer = async (): Promise<ElectrumServerItem | undefined> => {
try {
await DefaultPreference.setName(GROUP_IO_BLUEWALLET);
const host = (await DefaultPreference.get(ELECTRUM_HOST)) as string;
const tcpPort = await DefaultPreference.get(ELECTRUM_TCP_PORT);
@ -155,14 +156,22 @@ export const getPreferredServer = async (): Promise<ElectrumServerItem | undefin
tcp: tcpPort ? Number(tcpPort) : undefined,
ssl: sslPort ? Number(sslPort) : undefined,
};
} catch (error) {
console.error('Error in getPreferredServer:', error);
return undefined;
}
};
export const removePreferredServer = async () => {
try {
await DefaultPreference.setName(GROUP_IO_BLUEWALLET);
console.log('Removing preferred server');
await DefaultPreference.clear(ELECTRUM_HOST);
await DefaultPreference.clear(ELECTRUM_TCP_PORT);
await DefaultPreference.clear(ELECTRUM_SSL_PORT);
} catch (error) {
console.error('Error in removePreferredServer:', error);
}
};
export async function isDisabled(): Promise<boolean> {
@ -204,6 +213,7 @@ function getNextPeer() {
}
async function getSavedPeer(): Promise<Peer | null> {
try {
await DefaultPreference.setName(GROUP_IO_BLUEWALLET);
const host = (await DefaultPreference.get(ELECTRUM_HOST)) as string;
const tcpPort = await DefaultPreference.get(ELECTRUM_TCP_PORT);
@ -224,6 +234,10 @@ async function getSavedPeer(): Promise<Peer | null> {
}
return null;
} catch (error) {
console.error('Error in getSavedPeer:', error);
return null;
}
}
export async function connectMain(): Promise<void> {
@ -262,7 +276,8 @@ export async function connectMain(): Promise<void> {
// most likely got a timeout from electrum ping. lets reconnect
// but only if we were previously connected (mainConnected), otherwise theres other
// code which does connection retries
mainClient.close();
mainClient?.close();
mainClient = undefined;
mainConnected = false;
// dropping `mainConnected` flag ensures there wont be reconnection race condition if several
// errors triggered
@ -310,12 +325,15 @@ export async function connectMain(): Promise<void> {
} catch (e) {
mainConnected = false;
console.log('bad connection:', JSON.stringify(usingPeer), e);
mainClient?.close();
mainClient = undefined;
}
if (!mainConnected) {
console.log('retry');
connectionAttempt = connectionAttempt + 1;
mainClient.close && mainClient.close();
mainClient?.close();
mainClient = undefined;
if (connectionAttempt >= 5) {
presentNetworkErrorAlert(usingPeer);
} else {
@ -407,7 +425,8 @@ const presentNetworkErrorAlert = async (usingPeer?: Peer) => {
text: loc.wallets.list_tryagain,
onPress: () => {
connectionAttempt = 0;
mainClient.close() && mainClient.close();
mainClient?.close();
mainClient = undefined;
setTimeout(connectMain, 500);
},
style: 'default',
@ -418,7 +437,8 @@ const presentNetworkErrorAlert = async (usingPeer?: Peer) => {
presentResetToDefaultsAlert().then(result => {
if (result) {
connectionAttempt = 0;
mainClient.close() && mainClient.close();
mainClient?.close();
mainClient = undefined;
setTimeout(connectMain, 500);
}
});
@ -429,7 +449,8 @@ const presentNetworkErrorAlert = async (usingPeer?: Peer) => {
text: loc._.cancel,
onPress: () => {
connectionAttempt = 0;
mainClient.close() && mainClient.close();
mainClient?.close();
mainClient = undefined;
},
style: 'cancel',
},
@ -474,6 +495,7 @@ async function getRandomDynamicPeer(): Promise<Peer> {
}
export const getBalanceByAddress = async function (address: string): Promise<{ confirmed: number; unconfirmed: number }> {
try {
if (!mainClient) throw new Error('Electrum client is not connected');
const script = bitcoin.address.toOutputScript(address);
const hash = bitcoin.crypto.sha256(script);
@ -481,6 +503,10 @@ export const getBalanceByAddress = async function (address: string): Promise<{ c
const balance = await mainClient.blockchainScripthash_getBalance(reversedHash.toString('hex'));
balance.addr = address;
return balance;
} catch (error) {
console.error('Error in getBalanceByAddress:', error);
throw error;
}
};
export const getConfig = async function () {
@ -958,6 +984,7 @@ export async function multiGetTransactionByTxid<T extends boolean>(
}
// saving cache:
try {
realm.write(() => {
for (const txid of Object.keys(ret)) {
const tx = ret[txid];
@ -977,6 +1004,9 @@ export async function multiGetTransactionByTxid<T extends boolean>(
);
}
});
} catch (writeError) {
console.error('Failed to write transaction cache:', writeError);
}
return ret;
}