30 sec connection timeout
This commit is contained in:
parent
c3f09f4931
commit
9b67c6baa3
2 changed files with 17 additions and 23 deletions
|
|
@ -1,13 +1,11 @@
|
||||||
import TransportNodeHid from '@ledgerhq/hw-transport-node-hid';
|
import TransportNodeHid from '@ledgerhq/hw-transport-node-hid';
|
||||||
import TransportNodeBle from '@ledgerhq/hw-transport-node-ble';
|
import TransportNodeBle from '@ledgerhq/hw-transport-node-ble';
|
||||||
import Transport from '@ledgerhq/hw-transport';
|
import Transport from '@ledgerhq/hw-transport';
|
||||||
import * as LedgerLogs from '@ledgerhq/logs';
|
|
||||||
import Nano from 'hw-app-nano';
|
import Nano from 'hw-app-nano';
|
||||||
|
|
||||||
import * as rx from 'rxjs';
|
import * as rx from 'rxjs';
|
||||||
|
|
||||||
import { ipcMain } from 'electron';
|
import { ipcMain } from 'electron';
|
||||||
import { Observable } from 'rxjs';
|
|
||||||
|
|
||||||
const STATUS_CODES = {
|
const STATUS_CODES = {
|
||||||
SECURITY_STATUS_NOT_SATISFIED: 0x6982,
|
SECURITY_STATUS_NOT_SATISFIED: 0x6982,
|
||||||
|
|
@ -35,8 +33,7 @@ export interface LedgerData {
|
||||||
*/
|
*/
|
||||||
export class LedgerService {
|
export class LedgerService {
|
||||||
walletPrefix = `44'/165'/`;
|
walletPrefix = `44'/165'/`;
|
||||||
waitTimeout = 300000;
|
waitTimeout = 30000;
|
||||||
normalTimeout = 5000;
|
|
||||||
pollInterval = 10000;
|
pollInterval = 10000;
|
||||||
|
|
||||||
pollingLedger = false;
|
pollingLedger = false;
|
||||||
|
|
@ -65,25 +62,32 @@ export class LedgerService {
|
||||||
async loadTransport(bluetooth: boolean) {
|
async loadTransport(bluetooth: boolean) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const transport = bluetooth ? TransportNodeBle : TransportNodeHid;
|
const transport = bluetooth ? TransportNodeBle : TransportNodeHid;
|
||||||
|
|
||||||
let found = false;
|
let found = false;
|
||||||
const sub = transport.listen({
|
const sub = transport.listen({
|
||||||
next: async(e) => {
|
next: async(e) => {
|
||||||
found = true;
|
found = true;
|
||||||
if (sub) sub.unsubscribe();
|
if (sub) sub.unsubscribe();
|
||||||
|
clearTimeout(timeoutId);
|
||||||
this.ledger.transport = await transport.open(e.descriptor);
|
this.ledger.transport = await transport.open(e.descriptor);
|
||||||
this.ledger.transport.setExchangeTimeout(this.waitTimeout); // 5 minutes
|
|
||||||
this.ledger.nano = new Nano(this.ledger.transport);
|
this.ledger.nano = new Nano(this.ledger.transport);
|
||||||
resolve(this.ledger.transport);
|
resolve(this.ledger.transport);
|
||||||
},
|
},
|
||||||
error: (e) => reject(e),
|
error: (e) => {
|
||||||
|
clearTimeout(timeoutId);
|
||||||
|
reject(e);
|
||||||
|
},
|
||||||
complete: () => {
|
complete: () => {
|
||||||
|
clearTimeout(timeoutId);
|
||||||
if (!found) {
|
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) {
|
async getLedgerAccount(accountIndex, showOnScreen = false) {
|
||||||
try {
|
try {
|
||||||
this.ledger.transport.setExchangeTimeout(showOnScreen ? this.waitTimeout : this.normalTimeout);
|
|
||||||
|
|
||||||
this.queryingLedger = true;
|
this.queryingLedger = true;
|
||||||
const account = await this.ledger.nano.getAddress(this.ledgerPath(accountIndex), showOnScreen);
|
const account = await this.ledger.nano.getAddress(this.ledgerPath(accountIndex), showOnScreen);
|
||||||
this.queryingLedger = false;
|
this.queryingLedger = false;
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,7 @@ import TransportUSB from '@ledgerhq/hw-transport-webusb';
|
||||||
import TransportHID from '@ledgerhq/hw-transport-webhid';
|
import TransportHID from '@ledgerhq/hw-transport-webhid';
|
||||||
import TransportBLE from '@ledgerhq/hw-transport-web-ble';
|
import TransportBLE from '@ledgerhq/hw-transport-web-ble';
|
||||||
import Transport from '@ledgerhq/hw-transport';
|
import Transport from '@ledgerhq/hw-transport';
|
||||||
import * as LedgerLogs from '@ledgerhq/logs';
|
import {Subject} from 'rxjs';
|
||||||
import {Observable, Subject} from 'rxjs';
|
|
||||||
import {ApiService} from './api.service';
|
import {ApiService} from './api.service';
|
||||||
import {NotificationService} from './notification.service';
|
import {NotificationService} from './notification.service';
|
||||||
import { environment } from '../../environments/environment';
|
import { environment } from '../../environments/environment';
|
||||||
|
|
@ -47,8 +46,7 @@ const zeroBlock = '0000000000000000000000000000000000000000000000000000000000000
|
||||||
export class LedgerService {
|
export class LedgerService {
|
||||||
walletPrefix = `44'/165'/`;
|
walletPrefix = `44'/165'/`;
|
||||||
|
|
||||||
waitTimeout = 300000;
|
waitTimeout = 30000;
|
||||||
normalTimeout = 5000;
|
|
||||||
pollInterval = 5000;
|
pollInterval = 5000;
|
||||||
|
|
||||||
pollingLedger = false;
|
pollingLedger = false;
|
||||||
|
|
@ -70,7 +68,7 @@ export class LedgerService {
|
||||||
supportsUSB = false;
|
supportsUSB = false;
|
||||||
|
|
||||||
transportMode: 'U2F' | 'USB' | 'HID' | 'Bluetooth' = 'U2F';
|
transportMode: 'U2F' | 'USB' | 'HID' | 'Bluetooth' = 'U2F';
|
||||||
DynamicTransport = TransportU2F;
|
DynamicTransport = TransportU2F as typeof Transport;
|
||||||
|
|
||||||
ledgerStatus$: Subject<{ status: string, statusText: string }> = new Subject();
|
ledgerStatus$: Subject<{ status: string, statusText: string }> = new Subject();
|
||||||
desktopMessage$ = new Subject();
|
desktopMessage$ = new Subject();
|
||||||
|
|
@ -262,11 +260,10 @@ export class LedgerService {
|
||||||
|
|
||||||
async loadTransport() {
|
async loadTransport() {
|
||||||
return new Promise((resolve, reject) => {
|
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}`));
|
// LedgerLogs.listen((log: LedgerLog) => console.log(`Ledger: ${log.type}: ${log.message}`));
|
||||||
this.ledger.transport = trans;
|
this.ledger.transport = trans;
|
||||||
this.ledger.transport.setExchangeTimeout(this.waitTimeout); // 5 minutes
|
|
||||||
this.ledger.nano = new Nano(this.ledger.transport);
|
this.ledger.nano = new Nano(this.ledger.transport);
|
||||||
|
|
||||||
resolve(this.ledger.transport);
|
resolve(this.ledger.transport);
|
||||||
|
|
@ -334,9 +331,6 @@ export class LedgerService {
|
||||||
return resolve(false);
|
return resolve(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (this.ledger.status === LedgerStatus.READY) {
|
|
||||||
// return resolve(true); // Already ready?
|
|
||||||
// }
|
|
||||||
let resolved = false;
|
let resolved = false;
|
||||||
|
|
||||||
// Set up a timeout when things are not ready
|
// Set up a timeout when things are not ready
|
||||||
|
|
@ -453,7 +447,6 @@ export class LedgerService {
|
||||||
if (this.isDesktop) {
|
if (this.isDesktop) {
|
||||||
return this.signBlockDesktop(accountIndex, blockData);
|
return this.signBlockDesktop(accountIndex, blockData);
|
||||||
} else {
|
} else {
|
||||||
this.ledger.transport.setExchangeTimeout(this.waitTimeout);
|
|
||||||
return await this.ledger.nano.signBlock(this.ledgerPath(accountIndex), blockData);
|
return await this.ledger.nano.signBlock(this.ledgerPath(accountIndex), blockData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -463,7 +456,6 @@ export class LedgerService {
|
||||||
}
|
}
|
||||||
|
|
||||||
async getLedgerAccountWeb(accountIndex: number, showOnScreen = false) {
|
async getLedgerAccountWeb(accountIndex: number, showOnScreen = false) {
|
||||||
this.ledger.transport.setExchangeTimeout(showOnScreen ? this.waitTimeout : this.normalTimeout);
|
|
||||||
try {
|
try {
|
||||||
return await this.ledger.nano.getAddress(this.ledgerPath(accountIndex), showOnScreen);
|
return await this.ledger.nano.getAddress(this.ledgerPath(accountIndex), showOnScreen);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue