30 sec connection timeout

This commit is contained in:
Aleksander Rem 2022-02-04 22:05:04 +01:00
commit 9b67c6baa3
2 changed files with 17 additions and 23 deletions

View file

@ -1,13 +1,11 @@
import TransportNodeHid from '@ledgerhq/hw-transport-node-hid';
import TransportNodeBle from '@ledgerhq/hw-transport-node-ble';
import Transport from '@ledgerhq/hw-transport';
import * as LedgerLogs from '@ledgerhq/logs';
import Nano from 'hw-app-nano';
import * as rx from 'rxjs';
import { ipcMain } from 'electron';
import { Observable } from 'rxjs';
const STATUS_CODES = {
SECURITY_STATUS_NOT_SATISFIED: 0x6982,
@ -35,8 +33,7 @@ export interface LedgerData {
*/
export class LedgerService {
walletPrefix = `44'/165'/`;
waitTimeout = 300000;
normalTimeout = 5000;
waitTimeout = 30000;
pollInterval = 10000;
pollingLedger = false;
@ -65,25 +62,32 @@ export class LedgerService {
async loadTransport(bluetooth: boolean) {
return new Promise((resolve, reject) => {
const transport = bluetooth ? TransportNodeBle : TransportNodeHid;
let found = false;
const sub = transport.listen({
next: async(e) => {
found = true;
if (sub) sub.unsubscribe();
clearTimeout(timeoutId);
this.ledger.transport = await transport.open(e.descriptor);
this.ledger.transport.setExchangeTimeout(this.waitTimeout); // 5 minutes
this.ledger.nano = new Nano(this.ledger.transport);
resolve(this.ledger.transport);
},
error: (e) => reject(e),
error: (e) => {
clearTimeout(timeoutId);
reject(e);
},
complete: () => {
clearTimeout(timeoutId);
if (!found) {
reject(new Error('No device found'));
reject(new Error(transport.ErrorMessage_NoDeviceFound));
}
}
})
const timeoutId = setTimeout(() => {
sub.unsubscribe();
reject(new Error(transport.ErrorMessage_ListenTimeout));
}, this.waitTimeout);
});
}
@ -141,8 +145,6 @@ export class LedgerService {
async getLedgerAccount(accountIndex, showOnScreen = false) {
try {
this.ledger.transport.setExchangeTimeout(showOnScreen ? this.waitTimeout : this.normalTimeout);
this.queryingLedger = true;
const account = await this.ledger.nano.getAddress(this.ledgerPath(accountIndex), showOnScreen);
this.queryingLedger = false;

View file

@ -5,8 +5,7 @@ import TransportUSB from '@ledgerhq/hw-transport-webusb';
import TransportHID from '@ledgerhq/hw-transport-webhid';
import TransportBLE from '@ledgerhq/hw-transport-web-ble';
import Transport from '@ledgerhq/hw-transport';
import * as LedgerLogs from '@ledgerhq/logs';
import {Observable, Subject} from 'rxjs';
import {Subject} from 'rxjs';
import {ApiService} from './api.service';
import {NotificationService} from './notification.service';
import { environment } from '../../environments/environment';
@ -47,8 +46,7 @@ const zeroBlock = '0000000000000000000000000000000000000000000000000000000000000
export class LedgerService {
walletPrefix = `44'/165'/`;
waitTimeout = 300000;
normalTimeout = 5000;
waitTimeout = 30000;
pollInterval = 5000;
pollingLedger = false;
@ -70,7 +68,7 @@ export class LedgerService {
supportsUSB = false;
transportMode: 'U2F' | 'USB' | 'HID' | 'Bluetooth' = 'U2F';
DynamicTransport = TransportU2F;
DynamicTransport = TransportU2F as typeof Transport;
ledgerStatus$: Subject<{ status: string, statusText: string }> = new Subject();
desktopMessage$ = new Subject();
@ -262,11 +260,10 @@ export class LedgerService {
async loadTransport() {
return new Promise((resolve, reject) => {
this.DynamicTransport.create().then(trans => {
this.DynamicTransport.create(3000, this.waitTimeout).then(trans => {
// LedgerLogs.listen((log: LedgerLog) => console.log(`Ledger: ${log.type}: ${log.message}`));
this.ledger.transport = trans;
this.ledger.transport.setExchangeTimeout(this.waitTimeout); // 5 minutes
this.ledger.nano = new Nano(this.ledger.transport);
resolve(this.ledger.transport);
@ -334,9 +331,6 @@ export class LedgerService {
return resolve(false);
}
// if (this.ledger.status === LedgerStatus.READY) {
// return resolve(true); // Already ready?
// }
let resolved = false;
// Set up a timeout when things are not ready
@ -453,7 +447,6 @@ export class LedgerService {
if (this.isDesktop) {
return this.signBlockDesktop(accountIndex, blockData);
} else {
this.ledger.transport.setExchangeTimeout(this.waitTimeout);
return await this.ledger.nano.signBlock(this.ledgerPath(accountIndex), blockData);
}
}
@ -463,7 +456,6 @@ export class LedgerService {
}
async getLedgerAccountWeb(accountIndex: number, showOnScreen = false) {
this.ledger.transport.setExchangeTimeout(showOnScreen ? this.waitTimeout : this.normalTimeout);
try {
return await this.ledger.nano.getAddress(this.ledgerPath(accountIndex), showOnScreen);
} catch (err) {