Skip to content

Commit 415adcd

Browse files
authored
fix: ios & ext exchange firmware (#631)
* fix: ios & ext exchange firmware * chore: fix english note * fix: hard code message * fix: remove unuse code * chore: translate english
1 parent 3f1367f commit 415adcd

File tree

22 files changed

+5590
-5527
lines changed

22 files changed

+5590
-5527
lines changed

packages/connect-examples/electron-example/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "hardware-example",
33
"productName": "HardwareExample",
44
"executableName": "onekey-hardware-example",
5-
"version": "1.1.20",
5+
"version": "1.1.21-alpha.1",
66
"author": "OneKey",
77
"description": "End-to-end encrypted workspaces for teams",
88
"main": "dist/index.js",
@@ -22,7 +22,7 @@
2222
"ts:check": "yarn tsc --noEmit"
2323
},
2424
"dependencies": {
25-
"@onekeyfe/hd-transport-electron": "1.1.20",
25+
"@onekeyfe/hd-transport-electron": "1.1.21-alpha.1",
2626
"@stoprocent/noble": "2.3.4",
2727
"debug": "4.3.4",
2828
"electron-is-dev": "^3.0.1",

packages/connect-examples/expo-example/package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "expo-example",
3-
"version": "1.1.20",
3+
"version": "1.1.21-alpha.1",
44
"scripts": {
55
"start": "cross-env CONNECT_SRC=https://localhost:8087/ yarn expo start --dev-client",
66
"android": "yarn expo run:android",
@@ -19,10 +19,10 @@
1919
"@noble/ed25519": "^2.1.0",
2020
"@noble/hashes": "^1.3.3",
2121
"@noble/secp256k1": "^1.7.1",
22-
"@onekeyfe/hd-ble-sdk": "1.1.20",
23-
"@onekeyfe/hd-common-connect-sdk": "1.1.20",
24-
"@onekeyfe/hd-core": "1.1.20",
25-
"@onekeyfe/hd-web-sdk": "1.1.20",
22+
"@onekeyfe/hd-ble-sdk": "1.1.21-alpha.1",
23+
"@onekeyfe/hd-common-connect-sdk": "1.1.21-alpha.1",
24+
"@onekeyfe/hd-core": "1.1.21-alpha.1",
25+
"@onekeyfe/hd-web-sdk": "1.1.21-alpha.1",
2626
"@onekeyfe/react-native-ble-utils": "^0.1.3",
2727
"@polkadot/util-crypto": "13.1.1",
2828
"@react-native-async-storage/async-storage": "1.21.0",

packages/connect-examples/expo-playground/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "onekey-hardware-playground",
3-
"version": "1.1.20",
3+
"version": "1.1.21-alpha.1",
44
"private": true,
55
"sideEffects": [
66
"app/utils/shim.js",
@@ -17,9 +17,9 @@
1717
},
1818
"dependencies": {
1919
"@noble/hashes": "^1.8.0",
20-
"@onekeyfe/hd-common-connect-sdk": "1.1.20",
21-
"@onekeyfe/hd-core": "1.1.20",
22-
"@onekeyfe/hd-shared": "1.1.20",
20+
"@onekeyfe/hd-common-connect-sdk": "1.1.21-alpha.1",
21+
"@onekeyfe/hd-core": "1.1.21-alpha.1",
22+
"@onekeyfe/hd-shared": "1.1.21-alpha.1",
2323
"@radix-ui/react-checkbox": "^1.3.2",
2424
"@radix-ui/react-dialog": "^1.1.14",
2525
"@radix-ui/react-dropdown-menu": "^2.1.15",

packages/connect-examples/native-android-example/app/src/main/assets/index.e70e0048.js

Lines changed: 2716 additions & 2716 deletions
Large diffs are not rendered by default.

packages/connect-examples/native-ios-example/web/web_dist/index.e70e0048.js

Lines changed: 2729 additions & 2729 deletions
Large diffs are not rendered by default.

packages/core/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@onekeyfe/hd-core",
3-
"version": "1.1.20",
3+
"version": "1.1.21-alpha.1",
44
"description": "Core processes and APIs for communicating with OneKey hardware devices.",
55
"author": "OneKey",
66
"homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
@@ -25,8 +25,8 @@
2525
"url": "https://github.com/OneKeyHQ/hardware-js-sdk/issues"
2626
},
2727
"dependencies": {
28-
"@onekeyfe/hd-shared": "1.1.20",
29-
"@onekeyfe/hd-transport": "1.1.20",
28+
"@onekeyfe/hd-shared": "1.1.21-alpha.1",
29+
"@onekeyfe/hd-transport": "1.1.21-alpha.1",
3030
"axios": "1.12.2",
3131
"bignumber.js": "^9.0.2",
3232
"bytebuffer": "^5.0.1",

packages/core/src/api/FirmwareUpdateV3.ts

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
247247
}
248248

249249
this.postTipMessage(FirmwareUpdateTipMessage.StartTransferData);
250-
// 处理资源文件
250+
// Process resource zip contents
251251
if (resourceBinary) {
252252
const file = await JSZip.loadAsync(resourceBinary);
253253
const files = Object.entries(file.files);
@@ -358,19 +358,21 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
358358
const bootloaderVersion = getDeviceBootloaderVersion(features).join('.');
359359
const bleVersion = getDeviceBLEFirmwareVersion(features).join('.');
360360
const firmwareVersion = getDeviceFirmwareVersion(features).join('.');
361-
this.postTipMessage(FirmwareUpdateTipMessage.FirmwareUpdateCompleted);
362-
DevicePool.resetState();
363-
return {
364-
bootloaderVersion,
365-
bleVersion,
366-
firmwareVersion,
367-
};
361+
// Treat update as complete once firmware version becomes non-zero
362+
if (firmwareVersion !== '0.0.0') {
363+
this.postTipMessage(FirmwareUpdateTipMessage.FirmwareUpdateCompleted);
364+
DevicePool.resetState();
365+
return {
366+
bootloaderVersion,
367+
bleVersion,
368+
firmwareVersion,
369+
};
370+
}
371+
// Still in update mode; continue polling (e.g., iOS may return firmwareVersion 0.0.0 during switches)
372+
await wait(1000);
368373
} catch (error) {
369-
// Hardware install firmware progress message
370-
if (error.message && error.message.includes('Update mode')) {
371-
const updateParts = error.message.split('Update mode ');
372-
const progressValue = updateParts[1] ?? '0';
373-
const progress = parseInt(progressValue, 10) || 0;
374+
const progress = this.extractUpdateModeProgress(error);
375+
if (progress !== null) {
374376
this.postProgressMessage(progress, 'installingFirmware');
375377
await wait(1000);
376378
} else {
@@ -385,12 +387,48 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
385387
? 3 * 60 * 1000 // 3 minutes for BLE reconnect
386388
: 60 * 1000; // 1 minute for normal reconnect
387389

390+
await this.ensureWebUsbBootloaderReauthPrompt();
388391
await this.waitForDeviceReconnect(reconnectTimeout);
389392
}
390393
}
391394
}
392395
}
393396

397+
/**
398+
* Parse “Update mode XX” progress value from device errors to avoid hardcoded message.includes.
399+
*/
400+
private extractUpdateModeProgress(error: unknown): number | null {
401+
const message = this.normalizeErrorMessage(error);
402+
if (!message) {
403+
return null;
404+
}
405+
const match = message.match(/Update mode\s*(\d+)/i);
406+
if (!match) {
407+
return null;
408+
}
409+
const progress = parseInt(match[1], 10);
410+
return Number.isNaN(progress) ? null : progress;
411+
}
412+
413+
private normalizeErrorMessage(error: unknown): string {
414+
if (!error) {
415+
return '';
416+
}
417+
if (typeof error === 'string') {
418+
return error;
419+
}
420+
if (typeof error === 'object') {
421+
const { message } = error as { message?: unknown };
422+
if (typeof message === 'string') {
423+
return message;
424+
}
425+
if (message !== undefined && message !== null) {
426+
return String(message);
427+
}
428+
}
429+
return '';
430+
}
431+
394432
/**
395433
* @description Reconnect device - While update with bootloader, it will reconnect device
396434
* @param {number} timeout - The timeout for the reconnection

packages/core/src/api/firmware/FirmwareUpdateBaseMethod.ts

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ const isDeviceDisconnectedError = (error: unknown) => {
4040
export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
4141
checkPromise: Deferred<any> | null = null;
4242

43+
protected hasPromptedWebUsbBootloaderReauth = false;
44+
4345
init(): void {}
4446

4547
run(): Promise<any> {
@@ -153,7 +155,7 @@ export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
153155
}
154156
} catch (e) {
155157
Log.log(
156-
'FirmwareUpdateBaseMethod [checkDeviceToBootloader] promptDeviceInBootloaderForWebDevice failed: ',
158+
'FirmwareUpdateBaseMethod [checkDeviceToBootloader] _promptDeviceInBootloaderForWebDevice failed: ',
157159
e
158160
);
159161
this.checkPromise?.reject(e);
@@ -193,6 +195,29 @@ export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
193195
}, 30000);
194196
}
195197

198+
/**
199+
* Only prompt WebUSB in bootloader scenarios that require re-authorization
200+
* (e.g., switching between BTC-only and general firmware is treated as a new device).
201+
*/
202+
protected async ensureWebUsbBootloaderReauthPrompt() {
203+
if (
204+
this.hasPromptedWebUsbBootloaderReauth ||
205+
!DataManager.isBrowserWebUsb(DataManager.getSettings('env')) ||
206+
this.device.listenerCount(DEVICE.SELECT_DEVICE_IN_BOOTLOADER_FOR_WEB_DEVICE) === 0
207+
) {
208+
return;
209+
}
210+
211+
this.hasPromptedWebUsbBootloaderReauth = true;
212+
this.postTipMessage(FirmwareUpdateTipMessage.SelectDeviceInBootloaderForWebDevice);
213+
214+
try {
215+
await this._promptDeviceInBootloaderForWebDevice();
216+
} catch (error) {
217+
Log.log('WebUSB re-authorization failed: ', error);
218+
}
219+
}
220+
196221
private async _checkDeviceInBootloaderMode(
197222
connectId: string | undefined,
198223
intervalTimer?: ReturnType<typeof setInterval>,
@@ -430,8 +455,8 @@ export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
430455
}
431456

432457
/**
433-
* @description 设备重启(Bootloader 侧可用)
434-
* @param rebootType 重启类型,参考 RebootType 枚举
458+
* @description Device reboot (available in bootloader mode)
459+
* @param rebootType Reboot type, see the RebootType enum
435460
*/
436461
async reboot(rebootType: RebootType) {
437462
const typedCall = this.device.getCommands().typedCall.bind(this.device.getCommands());

packages/core/src/data-manager/DataManager.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ const Log = getLogger(LoggerNames.Core);
3434
export const FIRMWARE_FIELDS = [
3535
'firmware',
3636
'firmware-v2',
37-
'firmware-v7',
38-
'firmware-btc-v7',
37+
'firmware-v8',
38+
'firmware-btc-v8',
3939
] as const;
4040

4141
export type IFirmwareField = (typeof FIRMWARE_FIELDS)[number];
@@ -45,8 +45,8 @@ export type MessageVersion = 'latest' | 'v1';
4545
const FIRMWARE_FIELD_TYPE_MAP: Readonly<Record<IFirmwareField, EFirmwareType>> = {
4646
firmware: EFirmwareType.Universal,
4747
'firmware-v2': EFirmwareType.Universal,
48-
'firmware-v7': EFirmwareType.Universal,
49-
'firmware-btc-v7': EFirmwareType.BitcoinOnly,
48+
'firmware-v8': EFirmwareType.Universal,
49+
'firmware-btc-v8': EFirmwareType.BitcoinOnly,
5050
} as const;
5151

5252
function getFirmwareTypeFromField(firmwareField: IFirmwareField): EFirmwareType {

packages/core/src/types/settings.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,9 @@ type IKnownDevice = Exclude<IDeviceType, 'unknown'>;
9898
* // {
9999
* // firmware: IFirmwareReleaseInfo[];
100100
* // 'firmware-v2'?: IFirmwareReleaseInfo[];
101-
* // 'firmware-v7'?: IFirmwareReleaseInfo[];
101+
* // 'firmware-v8'?: IFirmwareReleaseInfo[];
102102
* // 'firmware-v8'?: IFirmwareReleaseInfo[]; // New
103-
* // 'firmware-btc-v7'?: IFirmwareReleaseInfo[];
103+
* // 'firmware-btc-v8'?: IFirmwareReleaseInfo[];
104104
* // 'firmware-btc-v8'?: IFirmwareReleaseInfo[]; // New
105105
* // ble: IBLEFirmwareReleaseInfo[];
106106
* // }
@@ -112,9 +112,9 @@ export type DeviceTypeMap = {
112112
/** Firmware v2 (Touch/Pro specific) */
113113
'firmware-v2'?: IFirmwareReleaseInfo[];
114114
/** Universal firmware v7 */
115-
'firmware-v7'?: IFirmwareReleaseInfo[];
115+
'firmware-v8'?: IFirmwareReleaseInfo[];
116116
/** Bitcoin-only firmware v7 */
117-
'firmware-btc-v7'?: IFirmwareReleaseInfo[];
117+
'firmware-btc-v8'?: IFirmwareReleaseInfo[];
118118
// Future firmware versions should be added here as optional fields:
119119
// 'firmware-v8'?: IFirmwareReleaseInfo[];
120120
// 'firmware-btc-v8'?: IFirmwareReleaseInfo[];

0 commit comments

Comments
 (0)