@onekeyfe/hd-transport-web-device 1.2.0-alpha.31 → 1.2.0-alpha.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__tests__/webusb-protocol-v2-timeout.test.ts +29 -0
- package/dist/electron-ble-transport.d.ts +1 -0
- package/dist/electron-ble-transport.d.ts.map +1 -1
- package/dist/index.d.ts +1 -10
- package/dist/index.js +17 -20
- package/dist/webusb.d.ts +0 -3
- package/dist/webusb.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/electron-ble-transport.ts +10 -1
- package/src/webusb.ts +3 -29
|
@@ -3,6 +3,7 @@ import transport, {
|
|
|
3
3
|
ProtocolV2,
|
|
4
4
|
ProtocolV2LinkError,
|
|
5
5
|
} from '@onekeyfe/hd-transport';
|
|
6
|
+
import { ONEKEY_WEBUSB_FILTER } from '@onekeyfe/hd-shared';
|
|
6
7
|
|
|
7
8
|
import WebUsbTransport from '../src/webusb';
|
|
8
9
|
|
|
@@ -20,6 +21,34 @@ const schema = {
|
|
|
20
21
|
};
|
|
21
22
|
|
|
22
23
|
describe('WebUsbTransport Protocol V2 timeout recovery', () => {
|
|
24
|
+
test('only enumerates devices with real USB serial numbers', async () => {
|
|
25
|
+
const filter = ONEKEY_WEBUSB_FILTER[0];
|
|
26
|
+
const deviceWithSerial = {
|
|
27
|
+
...filter,
|
|
28
|
+
manufacturerName: 'OneKey',
|
|
29
|
+
productName: 'OneKey Pro 2',
|
|
30
|
+
serialNumber: 'PRO2-SERIAL',
|
|
31
|
+
} as USBDevice;
|
|
32
|
+
const deviceWithoutSerial = {
|
|
33
|
+
...filter,
|
|
34
|
+
manufacturerName: 'OneKey',
|
|
35
|
+
productName: 'OneKey Pro 2',
|
|
36
|
+
serialNumber: null,
|
|
37
|
+
} as USBDevice;
|
|
38
|
+
const webusb = new WebUsbTransport();
|
|
39
|
+
webusb.usb = {
|
|
40
|
+
getDevices: jest.fn().mockResolvedValue([deviceWithSerial, deviceWithoutSerial]),
|
|
41
|
+
} as unknown as USB;
|
|
42
|
+
|
|
43
|
+
await expect(webusb.getConnectedDevices()).resolves.toEqual([
|
|
44
|
+
{
|
|
45
|
+
path: 'PRO2-SERIAL',
|
|
46
|
+
device: deviceWithSerial,
|
|
47
|
+
commType: 'webusb',
|
|
48
|
+
},
|
|
49
|
+
]);
|
|
50
|
+
});
|
|
51
|
+
|
|
23
52
|
test('keeps active links when the Protocol V2 schema is configured repeatedly', () => {
|
|
24
53
|
const webusb = new WebUsbTransport() as any;
|
|
25
54
|
webusb.invalidateAllProtocolV2UsbLinks = jest.fn().mockResolvedValue(undefined);
|
|
@@ -53,6 +53,7 @@ export default class ElectronBleTransport {
|
|
|
53
53
|
protocolType?: ProtocolType | undefined;
|
|
54
54
|
}>;
|
|
55
55
|
release(id: string): Promise<void>;
|
|
56
|
+
private releaseNative;
|
|
56
57
|
private createProtocolMismatchError;
|
|
57
58
|
private createProtocolDetectionError;
|
|
58
59
|
private clearProbeProtocol;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"electron-ble-transport.d.ts","sourceRoot":"","sources":["../src/electron-ble-transport.ts"],"names":[],"mappings":";AAsBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EAEZ,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,YAAY,MAAM,QAAQ,CAAC;AAIvC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,UAAU,CAAC,EAAE,UAAU,CAAC;KACzB;CACF;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,gBAAgB,CAAC,EAAE,YAAY,CAAC;CACjC,CAAC;AAoCF,MAAM,CAAC,OAAO,OAAO,oBAAoB;IACvC,OAAO,CAAC,SAAS,CAA0D;IAE3E,OAAO,CAAC,WAAW,CAA0D;IAE7E,OAAO,CAAC,6BAA6B,CAAqB;IAE1D,IAAI,SAA0B;IAE9B,UAAU,UAAS;IAEnB,UAAU,EAAE,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,GAAG,IAAI,CAAQ;IAExD,GAAG,CAAC,EAAE,GAAG,CAAC;IAEV,OAAO,CAAC,EAAE,YAAY,CAAC;IAEvB,OAAO,CAAC,gBAAgB,CAA0B;IAElD,OAAO,CAAC,cAAc,CAAwC;IAE9D,OAAO,CAAC,mBAAmB,CAAwC;IAEnE,OAAO,CAAC,SAAS,CAAsE;IAEvF,OAAO,CAAC,YAAY,CAAoD;IAExE,OAAO,CAAC,aAAa,CAAwC;IAE7D,OAAO,CAAC,eAAe,CAAgD;IAEvE,OAAO,CAAC,eAAe,CAmBpB;IAEH,OAAO,CAAC,oBAAoB,CAAsC;IAElE,OAAO,CAAC,kBAAkB,CAAsC;IAEhE,OAAO,CAAC,kBAAkB,CAAkC;IAE5D,OAAO,CAAC,qBAAqB,CAAK;IAElC,OAAO,CAAC,oBAAoB;IA+B5B,OAAO,CAAC,kBAAkB;IA0B1B,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,YAAY;IAcxC,SAAS,CAAC,UAAU,EAAE,GAAG;IAKzB,mBAAmB,CAAC,UAAU,EAAE,GAAG;IAgB7B,MAAM;IAIN,SAAS,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAqBxC,OAAO,CAAC,KAAK,EAAE,eAAe;;;;;;;;;;;IAoF9B,OAAO,CAAC,EAAE,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"electron-ble-transport.d.ts","sourceRoot":"","sources":["../src/electron-ble-transport.ts"],"names":[],"mappings":";AAsBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EAEZ,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,YAAY,MAAM,QAAQ,CAAC;AAIvC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,UAAU,CAAC,EAAE,UAAU,CAAC;KACzB;CACF;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,gBAAgB,CAAC,EAAE,YAAY,CAAC;CACjC,CAAC;AAoCF,MAAM,CAAC,OAAO,OAAO,oBAAoB;IACvC,OAAO,CAAC,SAAS,CAA0D;IAE3E,OAAO,CAAC,WAAW,CAA0D;IAE7E,OAAO,CAAC,6BAA6B,CAAqB;IAE1D,IAAI,SAA0B;IAE9B,UAAU,UAAS;IAEnB,UAAU,EAAE,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,GAAG,IAAI,CAAQ;IAExD,GAAG,CAAC,EAAE,GAAG,CAAC;IAEV,OAAO,CAAC,EAAE,YAAY,CAAC;IAEvB,OAAO,CAAC,gBAAgB,CAA0B;IAElD,OAAO,CAAC,cAAc,CAAwC;IAE9D,OAAO,CAAC,mBAAmB,CAAwC;IAEnE,OAAO,CAAC,SAAS,CAAsE;IAEvF,OAAO,CAAC,YAAY,CAAoD;IAExE,OAAO,CAAC,aAAa,CAAwC;IAE7D,OAAO,CAAC,eAAe,CAAgD;IAEvE,OAAO,CAAC,eAAe,CAmBpB;IAEH,OAAO,CAAC,oBAAoB,CAAsC;IAElE,OAAO,CAAC,kBAAkB,CAAsC;IAEhE,OAAO,CAAC,kBAAkB,CAAkC;IAE5D,OAAO,CAAC,qBAAqB,CAAK;IAElC,OAAO,CAAC,oBAAoB;IA+B5B,OAAO,CAAC,kBAAkB;IA0B1B,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,YAAY;IAcxC,SAAS,CAAC,UAAU,EAAE,GAAG;IAKzB,mBAAmB,CAAC,UAAU,EAAE,GAAG;IAgB7B,MAAM;IAIN,SAAS,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAqBxC,OAAO,CAAC,KAAK,EAAE,eAAe;;;;;;;;;;;IAoF9B,OAAO,CAAC,EAAE,EAAE,MAAM;YAUV,aAAa;IAe3B,OAAO,CAAC,2BAA2B;IAOnC,OAAO,CAAC,4BAA4B;IAOpC,OAAO,CAAC,kBAAkB;YAMZ,cAAc;IA+C5B,OAAO,CAAC,8BAA8B;YAgBxB,iCAAiC;YAqCjC,eAAe;YAgBf,eAAe;YAuBf,SAAS;IASvB,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,kBAAkB;IAwB1B,OAAO,CAAC,4BAA4B;IAkBpC,OAAO,CAAC,uBAAuB;IAS/B,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,sBAAsB;YAShB,mBAAmB;IAiBjC,OAAO,CAAC,4BAA4B;IAgB9B,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,oBAAoB;YA2BlB,cAAc;YAuEd,cAAc;IA0B5B,OAAO,CAAC,uBAAuB;IAyC/B,OAAO,CAAC,6BAA6B;IAsCrC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;CAGxD"}
|
package/dist/index.d.ts
CHANGED
|
@@ -22,12 +22,6 @@ declare class WebUsbTransport extends ProtocolV2UsbTransportBase<string> {
|
|
|
22
22
|
private deviceProtocolHints;
|
|
23
23
|
/** Per-path USB endpoint / interface numbers (discovered from USB descriptors) */
|
|
24
24
|
private deviceEndpoints;
|
|
25
|
-
/**
|
|
26
|
-
* Early Pro2 boards have no USB serial number. Assign a session-stable mock path per
|
|
27
|
-
* USBDevice instance so discovery retains them; reconnecting creates a new instance/path.
|
|
28
|
-
*/
|
|
29
|
-
private mockSerialPaths;
|
|
30
|
-
private mockSerialCounter;
|
|
31
25
|
name: string;
|
|
32
26
|
stopped: boolean;
|
|
33
27
|
configured: boolean;
|
|
@@ -66,10 +60,6 @@ declare class WebUsbTransport extends ProtocolV2UsbTransportBase<string> {
|
|
|
66
60
|
* It does NOT prompt the user to select a device
|
|
67
61
|
*/
|
|
68
62
|
enumerate(): Promise<DeviceInfo[]>;
|
|
69
|
-
/**
|
|
70
|
-
* Use the USB serial as the device path, falling back to a session-stable mock path.
|
|
71
|
-
*/
|
|
72
|
-
private getDevicePath;
|
|
73
63
|
/**
|
|
74
64
|
* Get list of connected devices
|
|
75
65
|
*/
|
|
@@ -211,6 +201,7 @@ declare class ElectronBleTransport {
|
|
|
211
201
|
protocolType?: ProtocolType | undefined;
|
|
212
202
|
}>;
|
|
213
203
|
release(id: string): Promise<void>;
|
|
204
|
+
private releaseNative;
|
|
214
205
|
private createProtocolMismatchError;
|
|
215
206
|
private createProtocolDetectionError;
|
|
216
207
|
private clearProbeProtocol;
|
package/dist/index.js
CHANGED
|
@@ -74,8 +74,6 @@ class WebUsbTransport extends transport.ProtocolV2UsbTransportBase {
|
|
|
74
74
|
this.deviceProtocol = new Map();
|
|
75
75
|
this.deviceProtocolHints = new Map();
|
|
76
76
|
this.deviceEndpoints = new Map();
|
|
77
|
-
this.mockSerialPaths = new WeakMap();
|
|
78
|
-
this.mockSerialCounter = 0;
|
|
79
77
|
this.name = 'WebUsbTransport';
|
|
80
78
|
this.stopped = false;
|
|
81
79
|
this.configured = false;
|
|
@@ -131,20 +129,6 @@ class WebUsbTransport extends transport.ProtocolV2UsbTransportBase {
|
|
|
131
129
|
return this.deviceList;
|
|
132
130
|
});
|
|
133
131
|
}
|
|
134
|
-
getDevicePath(device) {
|
|
135
|
-
var _a;
|
|
136
|
-
if (typeof device.serialNumber === 'string' && device.serialNumber.length > 0) {
|
|
137
|
-
return device.serialNumber;
|
|
138
|
-
}
|
|
139
|
-
let path = this.mockSerialPaths.get(device);
|
|
140
|
-
if (!path) {
|
|
141
|
-
this.mockSerialCounter += 1;
|
|
142
|
-
path = `mock-serial:${device.vendorId.toString(16)}:${device.productId.toString(16)}:${this.mockSerialCounter}`;
|
|
143
|
-
this.mockSerialPaths.set(device, path);
|
|
144
|
-
(_a = this.Log) === null || _a === void 0 ? void 0 : _a.debug(`[WebUSB] device has no serial number, using mock path: ${path}`);
|
|
145
|
-
}
|
|
146
|
-
return path;
|
|
147
|
-
}
|
|
148
132
|
getConnectedDevices() {
|
|
149
133
|
return __awaiter(this, void 0, void 0, function* () {
|
|
150
134
|
if (!this.usb)
|
|
@@ -152,10 +136,11 @@ class WebUsbTransport extends transport.ProtocolV2UsbTransportBase {
|
|
|
152
136
|
const devices = yield this.usb.getDevices();
|
|
153
137
|
const onekeyDevices = devices.filter(dev => {
|
|
154
138
|
const isOneKey = hdShared.ONEKEY_WEBUSB_FILTER.some((desc) => dev.vendorId === desc.vendorId && dev.productId === desc.productId);
|
|
155
|
-
|
|
139
|
+
const hasSerialNumber = typeof dev.serialNumber === 'string' && dev.serialNumber.length > 0;
|
|
140
|
+
return isOneKey && hasSerialNumber && !hdShared.isKnownTrezorWebUsbDevice(dev);
|
|
156
141
|
});
|
|
157
142
|
this.deviceList = onekeyDevices.map(device => {
|
|
158
|
-
const path =
|
|
143
|
+
const path = device.serialNumber;
|
|
159
144
|
const protocolHint = inferProtocolHintFromDeviceName$1(device.productName);
|
|
160
145
|
if (protocolHint) {
|
|
161
146
|
this.deviceProtocolHints.set(path, protocolHint);
|
|
@@ -786,7 +771,7 @@ class ElectronBleTransport {
|
|
|
786
771
|
this.rejectProtocolV2Frames(uuid, new Error(reason));
|
|
787
772
|
(_b = this.Log) === null || _b === void 0 ? void 0 : _b.debug('[Electron BLE] Protocol V2 link invalidated:', uuid, reason);
|
|
788
773
|
if (reason.startsWith('Protocol V2 link-fatal error:')) {
|
|
789
|
-
yield this.
|
|
774
|
+
yield this.releaseNative(uuid);
|
|
790
775
|
}
|
|
791
776
|
}),
|
|
792
777
|
});
|
|
@@ -975,10 +960,22 @@ class ElectronBleTransport {
|
|
|
975
960
|
});
|
|
976
961
|
}
|
|
977
962
|
release(id) {
|
|
978
|
-
var _a
|
|
963
|
+
var _a;
|
|
979
964
|
return __awaiter(this, void 0, void 0, function* () {
|
|
980
965
|
try {
|
|
981
966
|
yield this.protocolV2Links.invalidateLink(id, 'Electron BLE transport released');
|
|
967
|
+
yield this.releaseNative(id);
|
|
968
|
+
}
|
|
969
|
+
catch (error) {
|
|
970
|
+
(_a = this.Log) === null || _a === void 0 ? void 0 : _a.error('[Electron BLE] release failed:', error);
|
|
971
|
+
this.cleanupDeviceState(id);
|
|
972
|
+
}
|
|
973
|
+
});
|
|
974
|
+
}
|
|
975
|
+
releaseNative(id) {
|
|
976
|
+
var _a, _b;
|
|
977
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
978
|
+
try {
|
|
982
979
|
if (this.connectedDevices.has(id)) {
|
|
983
980
|
if ((_a = window.desktopApi) === null || _a === void 0 ? void 0 : _a.nobleBle) {
|
|
984
981
|
yield window.desktopApi.nobleBle.unsubscribe(id);
|
package/dist/webusb.d.ts
CHANGED
|
@@ -13,8 +13,6 @@ export default class WebUsbTransport extends ProtocolV2UsbTransportBase<string>
|
|
|
13
13
|
private deviceProtocol;
|
|
14
14
|
private deviceProtocolHints;
|
|
15
15
|
private deviceEndpoints;
|
|
16
|
-
private mockSerialPaths;
|
|
17
|
-
private mockSerialCounter;
|
|
18
16
|
name: string;
|
|
19
17
|
stopped: boolean;
|
|
20
18
|
configured: boolean;
|
|
@@ -30,7 +28,6 @@ export default class WebUsbTransport extends ProtocolV2UsbTransportBase<string>
|
|
|
30
28
|
configureProtocolV2(signedData: any): void;
|
|
31
29
|
promptDeviceAccess(): Promise<USBDevice | null>;
|
|
32
30
|
enumerate(): Promise<DeviceInfo[]>;
|
|
33
|
-
private getDevicePath;
|
|
34
31
|
getConnectedDevices(): Promise<DeviceInfo[]>;
|
|
35
32
|
acquire(input: AcquireInput): Promise<string | undefined>;
|
|
36
33
|
private createProtocolMismatchError;
|
package/dist/webusb.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webusb.d.ts","sourceRoot":"","sources":["../src/webusb.ts"],"names":[],"mappings":";AACA,OAAO,SAAS,EAAE,EAQhB,0BAA0B,EAE3B,MAAM,wBAAwB,CAAC;AAYhC,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,YAAY,EACZ,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AAsBhC,MAAM,WAAW,UAAW,SAAQ,oBAAoB;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,CAAC;IAClB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAaD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,0BAA0B,CAAC,MAAM,CAAC;IAC7E,QAAQ,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,cAAc,CAAC,GAAG,SAAS,CAAC;IAGlE,UAAU,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,cAAc,CAAC,GAAG,SAAS,CAAC;IAEpE,OAAO,CAAC,sBAAsB,CAAqB;IAGnD,OAAO,CAAC,cAAc,CAAwC;IAE9D,OAAO,CAAC,mBAAmB,CAAwC;IAGnE,OAAO,CAAC,eAAe,CAA2C;
|
|
1
|
+
{"version":3,"file":"webusb.d.ts","sourceRoot":"","sources":["../src/webusb.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onekeyfe/hd-transport-web-device",
|
|
3
|
-
"version": "1.2.0-alpha.
|
|
3
|
+
"version": "1.2.0-alpha.32",
|
|
4
4
|
"author": "OneKey",
|
|
5
5
|
"homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
|
|
6
6
|
"license": "MIT",
|
|
@@ -21,13 +21,13 @@
|
|
|
21
21
|
"lint:fix": "eslint . --fix"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@onekeyfe/hd-shared": "1.2.0-alpha.
|
|
25
|
-
"@onekeyfe/hd-transport": "1.2.0-alpha.
|
|
24
|
+
"@onekeyfe/hd-shared": "1.2.0-alpha.32",
|
|
25
|
+
"@onekeyfe/hd-transport": "1.2.0-alpha.32"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"@onekeyfe/hd-transport-electron": "1.2.0-alpha.
|
|
28
|
+
"@onekeyfe/hd-transport-electron": "1.2.0-alpha.32",
|
|
29
29
|
"@types/w3c-web-usb": "^1.0.6",
|
|
30
30
|
"@types/web-bluetooth": "^0.0.17"
|
|
31
31
|
},
|
|
32
|
-
"gitHead": "
|
|
32
|
+
"gitHead": "468888b93df8b147a512f63a8cbdc40ca1c5c1cf"
|
|
33
33
|
}
|
|
@@ -125,7 +125,7 @@ export default class ElectronBleTransport {
|
|
|
125
125
|
this.rejectProtocolV2Frames(uuid, new Error(reason));
|
|
126
126
|
this.Log?.debug('[Electron BLE] Protocol V2 link invalidated:', uuid, reason);
|
|
127
127
|
if (reason.startsWith('Protocol V2 link-fatal error:')) {
|
|
128
|
-
await this.
|
|
128
|
+
await this.releaseNative(uuid);
|
|
129
129
|
}
|
|
130
130
|
},
|
|
131
131
|
});
|
|
@@ -342,6 +342,15 @@ export default class ElectronBleTransport {
|
|
|
342
342
|
async release(id: string) {
|
|
343
343
|
try {
|
|
344
344
|
await this.protocolV2Links.invalidateLink(id, 'Electron BLE transport released');
|
|
345
|
+
await this.releaseNative(id);
|
|
346
|
+
} catch (error) {
|
|
347
|
+
this.Log?.error('[Electron BLE] release failed:', error);
|
|
348
|
+
this.cleanupDeviceState(id);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
private async releaseNative(id: string) {
|
|
353
|
+
try {
|
|
345
354
|
if (this.connectedDevices.has(id)) {
|
|
346
355
|
if (window.desktopApi?.nobleBle) {
|
|
347
356
|
await window.desktopApi.nobleBle.unsubscribe(id);
|
package/src/webusb.ts
CHANGED
|
@@ -83,14 +83,6 @@ export default class WebUsbTransport extends ProtocolV2UsbTransportBase<string>
|
|
|
83
83
|
/** Per-path USB endpoint / interface numbers (discovered from USB descriptors) */
|
|
84
84
|
private deviceEndpoints: Map<string, DeviceEndpoints> = new Map();
|
|
85
85
|
|
|
86
|
-
/**
|
|
87
|
-
* Early Pro2 boards have no USB serial number. Assign a session-stable mock path per
|
|
88
|
-
* USBDevice instance so discovery retains them; reconnecting creates a new instance/path.
|
|
89
|
-
*/
|
|
90
|
-
private mockSerialPaths: WeakMap<USBDevice, string> = new WeakMap();
|
|
91
|
-
|
|
92
|
-
private mockSerialCounter = 0;
|
|
93
|
-
|
|
94
86
|
name = 'WebUsbTransport';
|
|
95
87
|
|
|
96
88
|
stopped = false;
|
|
@@ -195,25 +187,6 @@ export default class WebUsbTransport extends ProtocolV2UsbTransportBase<string>
|
|
|
195
187
|
return this.deviceList;
|
|
196
188
|
}
|
|
197
189
|
|
|
198
|
-
/**
|
|
199
|
-
* Use the USB serial as the device path, falling back to a session-stable mock path.
|
|
200
|
-
*/
|
|
201
|
-
private getDevicePath(device: USBDevice): string {
|
|
202
|
-
if (typeof device.serialNumber === 'string' && device.serialNumber.length > 0) {
|
|
203
|
-
return device.serialNumber;
|
|
204
|
-
}
|
|
205
|
-
let path = this.mockSerialPaths.get(device);
|
|
206
|
-
if (!path) {
|
|
207
|
-
this.mockSerialCounter += 1;
|
|
208
|
-
path = `mock-serial:${device.vendorId.toString(16)}:${device.productId.toString(16)}:${
|
|
209
|
-
this.mockSerialCounter
|
|
210
|
-
}`;
|
|
211
|
-
this.mockSerialPaths.set(device, path);
|
|
212
|
-
this.Log?.debug(`[WebUSB] device has no serial number, using mock path: ${path}`);
|
|
213
|
-
}
|
|
214
|
-
return path;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
190
|
/**
|
|
218
191
|
* Get list of connected devices
|
|
219
192
|
*/
|
|
@@ -226,11 +199,12 @@ export default class WebUsbTransport extends ProtocolV2UsbTransportBase<string>
|
|
|
226
199
|
(desc: { vendorId: number; productId: number }) =>
|
|
227
200
|
dev.vendorId === desc.vendorId && dev.productId === desc.productId
|
|
228
201
|
);
|
|
229
|
-
|
|
202
|
+
const hasSerialNumber = typeof dev.serialNumber === 'string' && dev.serialNumber.length > 0;
|
|
203
|
+
return isOneKey && hasSerialNumber && !isKnownTrezorWebUsbDevice(dev);
|
|
230
204
|
});
|
|
231
205
|
|
|
232
206
|
this.deviceList = onekeyDevices.map(device => {
|
|
233
|
-
const path =
|
|
207
|
+
const path = device.serialNumber as string;
|
|
234
208
|
const protocolHint = inferProtocolHintFromDeviceName(device.productName);
|
|
235
209
|
if (protocolHint) {
|
|
236
210
|
this.deviceProtocolHints.set(path, protocolHint);
|