Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions packages/connect-examples/electron-example/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "hardware-example",
"productName": "HardwareExample",
"executableName": "onekey-hardware-example",
"version": "1.1.21-alpha.1",
"version": "1.1.21-alpha.2",
"author": "OneKey",
"description": "End-to-end encrypted workspaces for teams",
"main": "dist/index.js",
Expand All @@ -22,7 +22,7 @@
"ts:check": "yarn tsc --noEmit"
},
"dependencies": {
"@onekeyfe/hd-transport-electron": "1.1.21-alpha.1",
"@onekeyfe/hd-transport-electron": "1.1.21-alpha.2",
"@stoprocent/noble": "2.3.4",
"debug": "4.3.4",
"electron-is-dev": "^3.0.1",
Expand Down
10 changes: 5 additions & 5 deletions packages/connect-examples/expo-example/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "expo-example",
"version": "1.1.21-alpha.1",
"version": "1.1.21-alpha.2",
"scripts": {
"start": "cross-env CONNECT_SRC=https://localhost:8087/ yarn expo start --dev-client",
"android": "yarn expo run:android",
Expand All @@ -19,10 +19,10 @@
"@noble/ed25519": "^2.1.0",
"@noble/hashes": "^1.3.3",
"@noble/secp256k1": "^1.7.1",
"@onekeyfe/hd-ble-sdk": "1.1.21-alpha.1",
"@onekeyfe/hd-common-connect-sdk": "1.1.21-alpha.1",
"@onekeyfe/hd-core": "1.1.21-alpha.1",
"@onekeyfe/hd-web-sdk": "1.1.21-alpha.1",
"@onekeyfe/hd-ble-sdk": "1.1.21-alpha.2",
"@onekeyfe/hd-common-connect-sdk": "1.1.21-alpha.2",
"@onekeyfe/hd-core": "1.1.21-alpha.2",
"@onekeyfe/hd-web-sdk": "1.1.21-alpha.2",
"@onekeyfe/react-native-ble-utils": "^0.1.3",
"@polkadot/util-crypto": "13.1.1",
"@react-native-async-storage/async-storage": "1.21.0",
Expand Down
8 changes: 4 additions & 4 deletions packages/connect-examples/expo-playground/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "onekey-hardware-playground",
"version": "1.1.21-alpha.1",
"version": "1.1.21-alpha.2",
"private": true,
"sideEffects": [
"app/utils/shim.js",
Expand All @@ -17,9 +17,9 @@
},
"dependencies": {
"@noble/hashes": "^1.8.0",
"@onekeyfe/hd-common-connect-sdk": "1.1.21-alpha.1",
"@onekeyfe/hd-core": "1.1.21-alpha.1",
"@onekeyfe/hd-shared": "1.1.21-alpha.1",
"@onekeyfe/hd-common-connect-sdk": "1.1.21-alpha.2",
"@onekeyfe/hd-core": "1.1.21-alpha.2",
"@onekeyfe/hd-shared": "1.1.21-alpha.2",
"@radix-ui/react-checkbox": "^1.3.2",
"@radix-ui/react-dialog": "^1.1.14",
"@radix-ui/react-dropdown-menu": "^2.1.15",
Expand Down
6 changes: 3 additions & 3 deletions packages/core/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@onekeyfe/hd-core",
"version": "1.1.21-alpha.1",
"version": "1.1.21-alpha.2",
"description": "Core processes and APIs for communicating with OneKey hardware devices.",
"author": "OneKey",
"homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
Expand All @@ -25,8 +25,8 @@
"url": "https://github.com/OneKeyHQ/hardware-js-sdk/issues"
},
"dependencies": {
"@onekeyfe/hd-shared": "1.1.21-alpha.1",
"@onekeyfe/hd-transport": "1.1.21-alpha.1",
"@onekeyfe/hd-shared": "1.1.21-alpha.2",
"@onekeyfe/hd-transport": "1.1.21-alpha.2",
"axios": "1.12.2",
"bignumber.js": "^9.0.2",
"bytebuffer": "^5.0.1",
Expand Down
67 changes: 64 additions & 3 deletions packages/core/src/api/FirmwareUpdateV3.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { EDeviceType, ERRORS, HardwareErrorCode, wait } from '@onekeyfe/hd-shared';
import { EDeviceType, ERRORS, HardwareError, HardwareErrorCode, wait } from '@onekeyfe/hd-shared';
import semver from 'semver';
import JSZip from 'jszip';

Expand All @@ -17,6 +17,7 @@ import { getBinary, getSysResourceBinary } from './firmware/getBinary';
import { DataManager } from '../data-manager';
import { FirmwareUpdateBaseMethod } from './firmware/FirmwareUpdateBaseMethod';
import { DevicePool } from '../device/DevicePool';
import { DEVICE } from '../events';

import type { FirmwareUpdateV3Params } from '../types/api/firmwareUpdate';
import type { Deferred, EFirmwareType } from '@onekeyfe/hd-shared';
Expand Down Expand Up @@ -336,6 +337,9 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
const installStartTime = Date.now();
const maxWaitTimeForInstallingFirmware = 5 * 60 * 1000; // 5 minutes in milliseconds

let getFeaturesTimeoutCount = 0;
const maxGetFeaturesTimeoutBeforeReauth = 3;

// eslint-disable-next-line no-constant-condition
while (true) {
// Check if timeout exceeded
Expand All @@ -348,12 +352,24 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU

try {
const typedCall = this.device.getCommands().typedCall.bind(this.device.getCommands());
const timeoutMs = 3000;
const featuresRes = await Promise.race<TypedResponseMessage<'Features'>>([
typedCall('GetFeatures', 'Features', {}),
new Promise<never>((_, reject) => {
setTimeout(() => reject(new Error('GetFeatures timeout after 3 seconds')), 3000);
setTimeout(
() =>
reject(
ERRORS.TypedError(
HardwareErrorCode.CallMethodNotResponse,
'GetFeatures timeout',
{ method: 'GetFeatures', timeoutMs }
)
),
timeoutMs
);
}),
]);
getFeaturesTimeoutCount = 0;
const features = featuresRes.message;
const bootloaderVersion = getDeviceBootloaderVersion(features).join('.');
const bleVersion = getDeviceBLEFirmwareVersion(features).join('.');
Expand All @@ -371,11 +387,26 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
// Still in update mode; continue polling (e.g., iOS may return firmwareVersion 0.0.0 during switches)
await wait(1000);
} catch (error) {
Log.log('getFeatures error', error);
let shouldReconnect = true;
const progress = this.extractUpdateModeProgress(error);
if (progress !== null) {
getFeaturesTimeoutCount = 0;
this.postProgressMessage(progress, 'installingFirmware');
await wait(1000);
shouldReconnect = false;
} else if (this.isGetFeaturesTimeoutError(error)) {
getFeaturesTimeoutCount += 1;
// Retry transient GetFeatures timeouts to avoid unnecessary WebUSB re-authorization prompts.
if (getFeaturesTimeoutCount <= maxGetFeaturesTimeoutBeforeReauth) {
await wait(1000);
shouldReconnect = false;
}
} else {
getFeaturesTimeoutCount = 0;
}

if (shouldReconnect) {
await wait(1000);
/**
* Needs second reconnect case:
Expand All @@ -387,7 +418,7 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
? 3 * 60 * 1000 // 3 minutes for BLE reconnect
: 60 * 1000; // 1 minute for normal reconnect

await this.ensureWebUsbBootloaderReauthPrompt();
getFeaturesTimeoutCount = 0;
await this.waitForDeviceReconnect(reconnectTimeout);
}
}
Expand All @@ -410,6 +441,14 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
return Number.isNaN(progress) ? null : progress;
}

private isGetFeaturesTimeoutError(error: unknown): boolean {
return (
error instanceof HardwareError &&
error.errorCode === HardwareErrorCode.CallMethodNotResponse &&
error.params?.method === 'GetFeatures'
);
}

private normalizeErrorMessage(error: unknown): string {
if (!error) {
return '';
Expand All @@ -436,6 +475,7 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
async waitForDeviceReconnect(timeout: number) {
const startTime = Date.now();
const isBleReconnect = this.isBleReconnect();
let webUsbCheckCount = 0;
while (Date.now() - startTime < timeout) {
try {
if (isBleReconnect) {
Expand All @@ -462,6 +502,27 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
} else {
const deviceDiff = await this.device.deviceConnector?.enumerate();
const devicesDescriptor = deviceDiff?.descriptors ?? [];

const canPromptWebUsbBootloader =
DataManager.isBrowserWebUsb(DataManager.getSettings('env')) &&
!this.payload.skipWebDevicePrompt &&
this.device.listenerCount(DEVICE.SELECT_DEVICE_IN_BOOTLOADER_FOR_WEB_DEVICE) > 0;

if (canPromptWebUsbBootloader) {
webUsbCheckCount += 1;
if (webUsbCheckCount > 4) {
this.postTipMessage(FirmwareUpdateTipMessage.SelectDeviceInBootloaderForWebDevice);
try {
await this._promptDeviceInBootloaderForWebDevice();
} catch (e) {
Log.log('WebUSB re-authorization failed: ', e);
}
webUsbCheckCount = 0;
}
} else {
webUsbCheckCount = 0;
}

const { deviceList } = await DevicePool.getDevices(devicesDescriptor, this.connectId);

if (deviceList.length === 1) {
Expand Down
27 changes: 1 addition & 26 deletions packages/core/src/api/firmware/FirmwareUpdateBaseMethod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,6 @@ const isDeviceDisconnectedError = (error: unknown) => {
export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
checkPromise: Deferred<any> | null = null;

protected hasPromptedWebUsbBootloaderReauth = false;

init(): void {}

run(): Promise<any> {
Expand Down Expand Up @@ -94,7 +92,7 @@ export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
);
};

private async _promptDeviceInBootloaderForWebDevice() {
protected async _promptDeviceInBootloaderForWebDevice() {
return new Promise((resolve, reject) => {
if (this.device.listenerCount(DEVICE.SELECT_DEVICE_IN_BOOTLOADER_FOR_WEB_DEVICE) > 0) {
this.device.emit(
Expand Down Expand Up @@ -195,29 +193,6 @@ export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
}, 30000);
}

/**
* Only prompt WebUSB in bootloader scenarios that require re-authorization
* (e.g., switching between BTC-only and general firmware is treated as a new device).
*/
protected async ensureWebUsbBootloaderReauthPrompt() {
if (
this.hasPromptedWebUsbBootloaderReauth ||
!DataManager.isBrowserWebUsb(DataManager.getSettings('env')) ||
this.device.listenerCount(DEVICE.SELECT_DEVICE_IN_BOOTLOADER_FOR_WEB_DEVICE) === 0
) {
return;
}

this.hasPromptedWebUsbBootloaderReauth = true;
this.postTipMessage(FirmwareUpdateTipMessage.SelectDeviceInBootloaderForWebDevice);

try {
await this._promptDeviceInBootloaderForWebDevice();
} catch (error) {
Log.log('WebUSB re-authorization failed: ', error);
}
}

private async _checkDeviceInBootloaderMode(
connectId: string | undefined,
intervalTimer?: ReturnType<typeof setInterval>,
Expand Down
8 changes: 4 additions & 4 deletions packages/hd-ble-sdk/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@onekeyfe/hd-ble-sdk",
"version": "1.1.21-alpha.1",
"version": "1.1.21-alpha.2",
"author": "OneKey",
"homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
"license": "ISC",
Expand All @@ -20,8 +20,8 @@
"lint:fix": "eslint . --fix"
},
"dependencies": {
"@onekeyfe/hd-core": "1.1.21-alpha.1",
"@onekeyfe/hd-shared": "1.1.21-alpha.1",
"@onekeyfe/hd-transport-react-native": "1.1.21-alpha.1"
"@onekeyfe/hd-core": "1.1.21-alpha.2",
"@onekeyfe/hd-shared": "1.1.21-alpha.2",
"@onekeyfe/hd-transport-react-native": "1.1.21-alpha.2"
}
}
14 changes: 7 additions & 7 deletions packages/hd-common-connect-sdk/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@onekeyfe/hd-common-connect-sdk",
"version": "1.1.21-alpha.1",
"version": "1.1.21-alpha.2",
"author": "OneKey",
"homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
"license": "ISC",
Expand All @@ -20,11 +20,11 @@
"lint:fix": "eslint . --fix"
},
"dependencies": {
"@onekeyfe/hd-core": "1.1.21-alpha.1",
"@onekeyfe/hd-shared": "1.1.21-alpha.1",
"@onekeyfe/hd-transport-emulator": "1.1.21-alpha.1",
"@onekeyfe/hd-transport-http": "1.1.21-alpha.1",
"@onekeyfe/hd-transport-lowlevel": "1.1.21-alpha.1",
"@onekeyfe/hd-transport-web-device": "1.1.21-alpha.1"
"@onekeyfe/hd-core": "1.1.21-alpha.2",
"@onekeyfe/hd-shared": "1.1.21-alpha.2",
"@onekeyfe/hd-transport-emulator": "1.1.21-alpha.2",
"@onekeyfe/hd-transport-http": "1.1.21-alpha.2",
"@onekeyfe/hd-transport-lowlevel": "1.1.21-alpha.2",
"@onekeyfe/hd-transport-web-device": "1.1.21-alpha.2"
}
}
8 changes: 4 additions & 4 deletions packages/hd-transport-electron/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@onekeyfe/hd-transport-electron",
"version": "1.1.21-alpha.1",
"version": "1.1.21-alpha.2",
"author": "OneKey",
"homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
"license": "MIT",
Expand All @@ -25,9 +25,9 @@
"electron-log": ">=4.0.0"
},
"dependencies": {
"@onekeyfe/hd-core": "1.1.21-alpha.1",
"@onekeyfe/hd-shared": "1.1.21-alpha.1",
"@onekeyfe/hd-transport": "1.1.21-alpha.1",
"@onekeyfe/hd-core": "1.1.21-alpha.2",
"@onekeyfe/hd-shared": "1.1.21-alpha.2",
"@onekeyfe/hd-transport": "1.1.21-alpha.2",
"@stoprocent/noble": "2.3.4",
"p-retry": "^4.6.2"
},
Expand Down
6 changes: 3 additions & 3 deletions packages/hd-transport-emulator/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@onekeyfe/hd-transport-emulator",
"version": "1.1.21-alpha.1",
"version": "1.1.21-alpha.2",
"description": "hardware emulator transport",
"author": "OneKey",
"homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
Expand All @@ -24,8 +24,8 @@
"url": "https://github.com/OneKeyHQ/hardware-js-sdk/issues"
},
"dependencies": {
"@onekeyfe/hd-shared": "1.1.21-alpha.1",
"@onekeyfe/hd-transport": "1.1.21-alpha.1",
"@onekeyfe/hd-shared": "1.1.21-alpha.2",
"@onekeyfe/hd-transport": "1.1.21-alpha.2",
"axios": "1.12.2",
"secure-json-parse": "^4.0.0"
}
Expand Down
6 changes: 3 additions & 3 deletions packages/hd-transport-http/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@onekeyfe/hd-transport-http",
"version": "1.1.21-alpha.1",
"version": "1.1.21-alpha.2",
"description": "hardware http transport",
"author": "OneKey",
"homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
Expand All @@ -24,8 +24,8 @@
"url": "https://github.com/OneKeyHQ/hardware-js-sdk/issues"
},
"dependencies": {
"@onekeyfe/hd-shared": "1.1.21-alpha.1",
"@onekeyfe/hd-transport": "1.1.21-alpha.1",
"@onekeyfe/hd-shared": "1.1.21-alpha.2",
"@onekeyfe/hd-transport": "1.1.21-alpha.2",
"axios": "1.12.2",
"secure-json-parse": "^4.0.0"
}
Expand Down
6 changes: 3 additions & 3 deletions packages/hd-transport-lowlevel/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@onekeyfe/hd-transport-lowlevel",
"version": "1.1.21-alpha.1",
"version": "1.1.21-alpha.2",
"homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
"license": "MIT",
"main": "dist/index.js",
Expand All @@ -19,7 +19,7 @@
"lint:fix": "eslint . --fix"
},
"dependencies": {
"@onekeyfe/hd-shared": "1.1.21-alpha.1",
"@onekeyfe/hd-transport": "1.1.21-alpha.1"
"@onekeyfe/hd-shared": "1.1.21-alpha.2",
"@onekeyfe/hd-transport": "1.1.21-alpha.2"
}
}
Loading
Loading