Skip to content

Commit f472b52

Browse files
authored
feat: support common-sdk webusb (#587)
* feat: support common-sdk webusb * fix: delete unuse code * chore: 1.1.16-alpha.2 * chore: lint * fix: desktop-web-usb dispose * fix: delete unuse code * chore: fix dispose * chore: 1.1.16-alpha.3 * feat: use skipWebDevicePrompt while firmware upgrade * chore: 1.1.16-alpha.5
1 parent afb34e7 commit f472b52

File tree

31 files changed

+157
-84
lines changed

31 files changed

+157
-84
lines changed

.github/workflows/build-example-desktop-mac.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ jobs:
2626
yarn
2727
yarn bootstrap
2828
29+
- name: Build all packages
30+
run: |
31+
echo "🔨 Building all packages..."
32+
yarn build
33+
2934
- name: Build macOS App
3035
env:
3136
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

.github/workflows/build-example-desktop-win.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ jobs:
3030
yarn
3131
yarn bootstrap
3232
33+
- name: Build all packages
34+
run: |
35+
echo "🔨 Building all packages..."
36+
yarn build
37+
3338
- name: Build Windows App
3439
env:
3540
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

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.16-alpha.4",
5+
"version": "1.1.16-alpha.5",
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.16-alpha.4",
25+
"@onekeyfe/hd-transport-electron": "1.1.16-alpha.5",
2626
"@stoprocent/noble": "2.3.4",
2727
"debug": "4.3.4",
2828
"electron-is-dev": "^3.0.1",

packages/connect-examples/electron-example/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,8 @@ function createMainWindow() {
195195
log.debug('WebUSB: select-usb-device 事件触发');
196196
log.debug('WebUSB: 可用设备列表:', JSON.stringify(details.deviceList, null, 2));
197197

198-
// 阻止默认行为,以便我们可以自定义设备选择
198+
// 阻止默认行为,以便我们可以自动选择设备
199+
// 这是 Electron 的优势:不像浏览器必须显示弹窗,桌面应用可以自动化处理
199200
event.preventDefault();
200201

201202
// 直接选择第一个设备

packages/connect-examples/electron-example/webpack.config.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ module.exports = {
4343
externals: [
4444
nodeExternals({
4545
allowlist: [
46-
'@onekeyfe/hd-transport-electron',
46+
// Include all @onekeyfe packages to handle transitive dependencies
47+
/^@onekeyfe\//,
4748
...Object.keys({
4849
...pkg.dependencies,
4950
...pkg.devDependencies,

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@
1616
"fallbackToCacheTimeout": 0
1717
},
1818
"assetBundlePatterns": ["**/*"],
19-
"headers": {
20-
"Permissions-Policy": "usb=(self)"
21-
},
2219
"ios": {
2320
"supportsTablet": true,
2421
"bundleIdentifier": "com.onekey.dev.hardware.example"

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.16-alpha.4",
3+
"version": "1.1.16-alpha.5",
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.16-alpha.4",
23-
"@onekeyfe/hd-common-connect-sdk": "1.1.16-alpha.4",
24-
"@onekeyfe/hd-core": "1.1.16-alpha.4",
25-
"@onekeyfe/hd-web-sdk": "1.1.16-alpha.4",
22+
"@onekeyfe/hd-ble-sdk": "1.1.16-alpha.5",
23+
"@onekeyfe/hd-common-connect-sdk": "1.1.16-alpha.5",
24+
"@onekeyfe/hd-core": "1.1.16-alpha.5",
25+
"@onekeyfe/hd-web-sdk": "1.1.16-alpha.5",
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-example/src/atoms/deviceConnectAtoms.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { atom } from 'jotai';
22

3-
// Connection type atom: 'bridge' | 'webusb' | 'emulator' | 'desktop-web-ble'
43
export type ConnectionType = 'bridge' | 'webusb' | 'emulator' | 'desktop-web-ble';
54

65
// Use plain atom - persistence will be handled manually

packages/connect-examples/expo-example/src/components/DeviceList.tsx

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,21 @@ export type Device = {
3333

3434
const CONNECTION_TYPE_STORE_KEY = '@onekey/connectionType';
3535

36+
/**
37+
* Determine if the connection type should use hd-common-connect-sdk
38+
*/
39+
const shouldUseCommonSdk = (connectionType: ConnectionType | null): boolean =>
40+
connectionType === 'desktop-web-ble' || connectionType === 'webusb';
41+
42+
/**
43+
* Check if switching between connection types requires app restart
44+
*/
45+
const needsRestartForSwitch = (from: ConnectionType | null, to: ConnectionType | null): boolean => {
46+
const fromUsesCommonSdk = shouldUseCommonSdk(from);
47+
const toUsesCommonSdk = shouldUseCommonSdk(to);
48+
return fromUsesCommonSdk !== toUsesCommonSdk;
49+
};
50+
3651
const storeConnectionType = async (value: ConnectionType) => {
3752
try {
3853
await setItem(CONNECTION_TYPE_STORE_KEY, value);
@@ -161,14 +176,17 @@ function DeviceListFC(
161176
setConnectionType(value);
162177
await storeConnectionType(value);
163178

164-
// Restart desktop client when switching between desktop-web-ble and other modes
165-
const needsRestart =
166-
Platform.OS === 'web' &&
167-
(previousConnectionType === 'desktop-web-ble' || value === 'desktop-web-ble') &&
168-
previousConnectionType !== value;
179+
// Restart desktop client when switching between different SDK types
180+
// (e.g., bridge <-> webusb, bridge <-> desktop-web-ble, webusb <-> desktop-web-ble)
181+
const shouldRestart =
182+
Platform.OS === 'web' && needsRestartForSwitch(previousConnectionType, value);
169183

170184
// @ts-expect-error
171-
if (needsRestart && window.desktopApi?.restart) {
185+
if (shouldRestart && window.desktopApi?.restart) {
186+
console.log('Restarting app due to SDK type change:', {
187+
from: previousConnectionType,
188+
to: value,
189+
});
172190
// @ts-expect-error
173191
window.desktopApi.restart();
174192
return; // Exit early as the app will restart

packages/connect-examples/expo-example/src/utils/hardwareInstance.ts

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,31 @@ let initialized = false;
1313

1414
const CONNECTION_TYPE_STORE_KEY = '@onekey/connectionType';
1515

16+
/**
17+
* Determine if the connection type should use hd-common-connect-sdk
18+
*/
19+
const shouldUseCommonSdk = (connectionType: ConnectionType | null): boolean =>
20+
connectionType === 'desktop-web-ble' || connectionType === 'webusb';
21+
22+
/**
23+
* Map connection type to SDK env parameter
24+
*/
25+
const getSDKEnv = (
26+
connectionType: ConnectionType | null
27+
): 'webusb' | 'emulator' | 'desktop-web-ble' | 'web' => {
28+
switch (connectionType) {
29+
case 'desktop-web-ble':
30+
return 'desktop-web-ble';
31+
case 'webusb':
32+
return 'webusb';
33+
case 'emulator':
34+
return 'emulator';
35+
case 'bridge':
36+
default:
37+
return 'web';
38+
}
39+
};
40+
1641
const getStoredConnectionType = async (): Promise<ConnectionType | null> => {
1742
try {
1843
const value = await getItem(CONNECTION_TYPE_STORE_KEY);
@@ -44,19 +69,24 @@ export const getHardwareSDKInstance = memoizee(
4469
fetchConfig: true,
4570
};
4671

47-
// Get stored connection type to determine useCommonSdk
72+
// Get stored connection type to determine SDK type and transport
4873
const storedConnectionType = await getStoredConnectionType();
49-
const isDesktopWebBleEnv = storedConnectionType === 'desktop-web-ble';
74+
const useCommonSdk = shouldUseCommonSdk(storedConnectionType);
75+
76+
console.log('SDK Configuration: =====> ', {
77+
connectionType: storedConnectionType,
78+
useCommonSdk,
79+
sdkEnv: getSDKEnv(storedConnectionType),
80+
});
5081

51-
console.log('isDesktopWebBleEnv: =====> ', isDesktopWebBleEnv, storedConnectionType);
5282
HardwareSDK = await importSdk({
53-
useCommonSdk: isDesktopWebBleEnv,
83+
useCommonSdk,
5484
});
5585
console.log(HardwareSDK);
5686

5787
if (Platform.OS === 'web') {
5888
settings.connectSrc = CONNECT_SRC;
59-
settings.env = isDesktopWebBleEnv ? 'desktop-web-ble' : 'web';
89+
settings.env = getSDKEnv(storedConnectionType);
6090
settings.preRelease = true;
6191
HardwareLowLevelSDK = await importLowLevelSDK();
6292

0 commit comments

Comments
 (0)