Skip to content

Commit b6e8033

Browse files
author
Marcin Mazurek
committed
[DDW-1102] Add retry to Trezor calls
1 parent 056cacb commit b6e8033

File tree

4 files changed

+56
-12
lines changed

4 files changed

+56
-12
lines changed

source/common/utils/wait.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export const wait = (ms: number): Promise<void> =>
2+
new Promise((resolve) => setTimeout(resolve, ms));

source/main/ipc/getHardwareWalletChannel.ts

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import TransportNodeHid, {
44
} from '@ledgerhq/hw-transport-node-hid-noevents';
55
import AppAda, { utils } from '@cardano-foundation/ledgerjs-hw-app-cardano';
66
import TrezorConnect, {
7-
CardanoPublicKey,
87
DEVICE,
98
DEVICE_EVENT,
109
Features,
@@ -33,6 +32,7 @@ import { HardwareWalletChannels } from './createHardwareWalletIPCChannels';
3332
import { Device } from './hardwareWallets/ledger/deviceDetection/types';
3433
import { DeviceDetectionPayload } from './hardwareWallets/ledger/deviceDetection/deviceDetection';
3534
import { initTrezorConnect, reinitTrezorConnect } from '../trezor/connection';
35+
import { getTrezorDeviceFeatures } from './hardwareWallets/trezor/getTrezorDeviceFeatures';
3636

3737
type ListenerType = {
3838
unsubscribe: (...args: Array<any>) => any;
@@ -154,6 +154,9 @@ class EventObserver {
154154
}
155155
}
156156

157+
const wait = (ms: number): Promise<void> =>
158+
new Promise((resolve) => setTimeout(resolve, ms));
159+
157160
export const handleHardwareWalletRequests = async (
158161
mainWindow: BrowserWindow,
159162
{
@@ -285,13 +288,9 @@ export const handleHardwareWalletRequests = async (
285288
if (isTrezor) {
286289
logger.info('[HW-DEBUG] getHardwareWalletTransportChannel::TREZOR ');
287290

288-
try {
289-
deviceFeatures = await TrezorConnect.getFeatures({
290-
device: {
291-
path: devicePath,
292-
},
293-
});
291+
deviceFeatures = await getTrezorDeviceFeatures();
294292

293+
try {
295294
logger.info('[TREZOR-CONNECT] Called TrezorConnect.getFeatures()');
296295

297296
if (deviceFeatures && deviceFeatures.success) {
@@ -466,6 +465,9 @@ export const handleHardwareWalletRequests = async (
466465
}
467466
});
468467
deriveAddressChannel.onRequest(async (params) => {
468+
await reinitTrezorConnect();
469+
resetTrezorListeners();
470+
469471
const {
470472
addressType,
471473
spendingPathStr,
@@ -766,7 +768,8 @@ export const handleHardwareWalletRequests = async (
766768
resetTrezorListeners();
767769

768770
logger.info('[TREZOR-CONNECT] Calling TrezorConnect.getFeatures()');
769-
const deviceFeatures = await TrezorConnect.getFeatures();
771+
772+
const deviceFeatures = await getTrezorDeviceFeatures();
770773

771774
if (deviceFeatures.success) {
772775
logger.info(
@@ -880,6 +883,13 @@ export const handleHardwareWalletRequests = async (
880883

881884
resetTrezorActionChannel.onRequest(async () => {
882885
logger.info('[TREZOR-CONNECT] Called TrezorConnect.cancel()');
883-
TrezorConnect.cancel('Method_Cancel');
886+
887+
try {
888+
TrezorConnect.cancel();
889+
} catch (error) {
890+
logger.warn(
891+
'[TREZOR-CONNECT] Failed to cancel the operation:' + error.error
892+
);
893+
}
884894
});
885895
};
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import TrezorConnect from 'trezor-connect';
2+
import { logger } from '../../../utils/logging';
3+
import { wait } from '../../../../common/utils/wait';
4+
5+
export const getTrezorDeviceFeatures = async (retries = 3) => {
6+
const features = await TrezorConnect.getFeatures();
7+
8+
if (retries < 0) {
9+
throw new Error('Failed to get Trezor device features');
10+
}
11+
12+
if (features.success === false) {
13+
if (
14+
features.payload.code === 'Device_CallInProgress' ||
15+
features.payload.error === 'wrong previous session' ||
16+
features.payload.error === 'device disconnected during action'
17+
) {
18+
logger.info(
19+
'[TREZOR-CONNECT] Got Device_CallInProgress error - retrying'
20+
);
21+
22+
await wait(1000);
23+
return getTrezorDeviceFeatures(retries - 1);
24+
}
25+
26+
logger.error(
27+
'[TREZOR-CONNECT] Got other error - not retrying',
28+
features.payload
29+
);
30+
31+
throw features.payload;
32+
}
33+
34+
return features;
35+
};

source/renderer/app/api/utils/apiHelpers.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@ export const testSync = (apiMethod: (...args: Array<any>) => any) => {
1919
console.log(`testSync result: ${result}`);
2020
return result;
2121
};
22-
// helper code for deferring API call execution
23-
export const wait = (ms: number): Promise<void> =>
24-
new Promise((resolve) => setTimeout(resolve, ms));
2522
export const doesWalletRequireAdaToRemainToSupportTokens = (
2623
error: ErrorType,
2724
hasAssetsRemainingAfterTransaction?: boolean

0 commit comments

Comments
 (0)