@onekeyfe/hd-core 1.1.20-alpha.2 → 1.1.21-alpha.0
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/dist/api/FirmwareUpdateV3.d.ts +3 -0
- package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
- package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +2 -0
- package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
- package/dist/data-manager/DataManager.d.ts +1 -1
- package/dist/data-manager/DataManager.d.ts.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.js +138 -39
- package/dist/types/settings.d.ts +3 -2
- package/dist/types/settings.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/api/FirmwareUpdateV3.ts +83 -24
- package/src/api/firmware/FirmwareUpdateBaseMethod.ts +26 -1
- package/src/data-manager/DataManager.ts +53 -17
- package/src/types/settings.ts +5 -4
- package/src/utils/deviceFeaturesUtils.ts +6 -6
|
@@ -15,6 +15,9 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
15
15
|
private prepareBootloaderBinary;
|
|
16
16
|
private prepareFirmwareAndBleBinary;
|
|
17
17
|
private executeUpdate;
|
|
18
|
+
private extractUpdateModeProgress;
|
|
19
|
+
private shouldSkipReconnect;
|
|
20
|
+
private normalizeErrorMessage;
|
|
18
21
|
waitForDeviceReconnect(timeout: number): Promise<void>;
|
|
19
22
|
}
|
|
20
23
|
//# sourceMappingURL=FirmwareUpdateV3.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirmwareUpdateV3.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV3.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAG/E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,qBAAqB,CAAC;AAKnE,eAAO,MAAM,gCAAgC,UAAU,CAAC;AAaxD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,wBAAwB,CAAC,sBAAsB,CAAC;IAC5F,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAQ;IAE1C,IAAI;IAmCE,GAAG;;;;;IA8CT,OAAO,CAAC,wBAAwB;YAiBlB,qBAAqB;YAoBrB,uBAAuB;YAiBvB,2BAA2B;YAiD3B,aAAa;
|
|
1
|
+
{"version":3,"file":"FirmwareUpdateV3.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV3.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAG/E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,qBAAqB,CAAC;AAKnE,eAAO,MAAM,gCAAgC,UAAU,CAAC;AAaxD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,wBAAwB,CAAC,sBAAsB,CAAC;IAC5F,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAQ;IAE1C,IAAI;IAmCE,GAAG;;;;;IA8CT,OAAO,CAAC,wBAAwB;YAiBlB,qBAAqB;YAoBrB,uBAAuB;YAiBvB,2BAA2B;YAiD3B,aAAa;IA+K3B,OAAO,CAAC,yBAAyB;IAgBjC,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,qBAAqB;IAuBvB,sBAAsB,CAAC,OAAO,EAAE,MAAM;CAoD7C"}
|
|
@@ -7,6 +7,7 @@ import type { Deferred } from '@onekeyfe/hd-shared';
|
|
|
7
7
|
import type { TypedResponseMessage } from '../../device/DeviceCommands';
|
|
8
8
|
export declare class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
|
|
9
9
|
checkPromise: Deferred<any> | null;
|
|
10
|
+
protected hasPromptedWebUsbBootloaderReauth: boolean;
|
|
10
11
|
init(): void;
|
|
11
12
|
run(): Promise<any>;
|
|
12
13
|
isBleReconnect(): boolean;
|
|
@@ -15,6 +16,7 @@ export declare class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params>
|
|
|
15
16
|
postProgressMessage: (progress: number, progressType: IFirmwareUpdateProgressType) => void;
|
|
16
17
|
private _promptDeviceInBootloaderForWebDevice;
|
|
17
18
|
checkDeviceToBootloader(connectId: string | undefined): void;
|
|
19
|
+
protected ensureWebUsbBootloaderReauthPrompt(): Promise<void>;
|
|
18
20
|
private _checkDeviceInBootloaderMode;
|
|
19
21
|
enterBootloaderMode(): Promise<true | undefined>;
|
|
20
22
|
startEmmcFirmwareUpdate({ path }: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirmwareUpdateBaseMethod.d.ts","sourceRoot":"","sources":["../../../src/api/firmware/FirmwareUpdateBaseMethod.ts"],"names":[],"mappings":";AAaA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,OAAO,KAAK,EACV,2BAA2B,EAC3B,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAexE,qBAAa,wBAAwB,CAAC,MAAM,CAAE,SAAQ,UAAU,CAAC,MAAM,CAAC;IACtE,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAQ;IAE1C,IAAI,IAAI,IAAI;IAEZ,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAInB,cAAc,IAAI,OAAO;IASzB,cAAc,YAAa,yBAAyB,UASlD;IAMF,qBAAqB,SAAU,UAAU,GAAG,KAAK,GAAG,YAAY,GAAG,UAAU,UAM3E;IAMF,mBAAmB,aAAc,MAAM,gBAAgB,2BAA2B,UAQhF;YAEY,qCAAqC;IAkBnD,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;
|
|
1
|
+
{"version":3,"file":"FirmwareUpdateBaseMethod.d.ts","sourceRoot":"","sources":["../../../src/api/firmware/FirmwareUpdateBaseMethod.ts"],"names":[],"mappings":";AAaA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,OAAO,KAAK,EACV,2BAA2B,EAC3B,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAexE,qBAAa,wBAAwB,CAAC,MAAM,CAAE,SAAQ,UAAU,CAAC,MAAM,CAAC;IACtE,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAQ;IAE1C,SAAS,CAAC,iCAAiC,UAAS;IAEpD,IAAI,IAAI,IAAI;IAEZ,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAInB,cAAc,IAAI,OAAO;IASzB,cAAc,YAAa,yBAAyB,UASlD;IAMF,qBAAqB,SAAU,UAAU,GAAG,KAAK,GAAG,YAAY,GAAG,UAAU,UAM3E;IAMF,mBAAmB,aAAc,MAAM,gBAAgB,2BAA2B,UAQhF;YAEY,qCAAqC;IAkBnD,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;cAuFrC,kCAAkC;YAmBpC,4BAA4B;IAuBpC,mBAAmB;IA8CnB,uBAAuB,CAAC,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;IA6BlD,8BAA8B,CAAC,IAAI,EAAE,MAAM;IAW3C,uBAAuB,CAAC,EAC5B,OAAO,EACP,QAAQ,EACR,aAAa,EACb,SAAS,GACV,EAAE,KAAK,CAAC,cAAc,GAAG;QACxB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;IA4CK,sBAAsB,CAC1B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,WAAW,GAAG,MAAM,EAC3B,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,MAAM,GAAG,IAAI;IAwEnB,MAAM,CAAC,UAAU,EAAE,UAAU;CAsBpC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EFirmwareType } from '@onekeyfe/hd-shared';
|
|
2
2
|
import type { AssetsMap, ConnectSettings, DeviceTypeMap, Features, IDeviceBLEFirmwareStatus, IDeviceFirmwareStatus, ITransportStatus, IVersionArray } from '../types';
|
|
3
|
-
export declare const FIRMWARE_FIELDS: readonly ["firmware", "firmware-v2", "firmware-
|
|
3
|
+
export declare const FIRMWARE_FIELDS: readonly ["firmware", "firmware-v2", "firmware-v8", "firmware-btc-v8"];
|
|
4
4
|
export type IFirmwareField = (typeof FIRMWARE_FIELDS)[number];
|
|
5
5
|
export type MessageVersion = 'latest' | 'v1';
|
|
6
6
|
export default class DataManager {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataManager.d.ts","sourceRoot":"","sources":["../../src/data-manager/DataManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"DataManager.d.ts","sourceRoot":"","sources":["../../src/data-manager/DataManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAiBjE,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,aAAa,EACb,QAAQ,EACR,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,EAEd,MAAM,UAAU,CAAC;AAIlB,eAAO,MAAM,eAAe,wEAKlB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,IAAI,CAAC;AAqB7C,MAAM,CAAC,OAAO,OAAO,WAAW;IAC9B,MAAM,CAAC,SAAS,EAAE,aAAa,CAyB7B;IAEF,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAQ;IAEvC,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC;IAEjC,MAAM,CAAC,QAAQ,EAAE;SAAG,OAAO,IAAI,cAAc,GAAG,IAAI;KAAE,CAGpD;IAEF,MAAM,CAAC,kBAAkB,SAAK;IAE9B,MAAM,CAAC,iBAAiB,aACZ,QAAQ,gBACJ,aAAa,KAC1B,qBAAqB,CAyBtB;IAMF,MAAM,CAAC,4BAA4B;kBAKvB,QAAQ;;sBAEJ,aAAa;6BAqB3B;IAMF,MAAM,CAAC,kBAAkB,aAAc,QAAQ,gBAAgB,aAAa,wBAe1E;IAEF,MAAM,CAAC,qBAAqB,aAAc,QAAQ,gBAAgB,aAAa,wBAmB7E;IAEF,MAAM,CAAC,0BAA0B,aACrB,QAAQ,gBACJ,aAAa,KAC1B,aAAa,GAAG,SAAS,CAa1B;IAEF,MAAM,CAAC,mCAAmC,aAC9B,QAAQ,gBACJ,aAAa,KAC1B,aAAa,GAAG,SAAS,CAgB1B;IAEF,MAAM,CAAC,oBAAoB,aAAc,QAAQ,gBAAgB,aAAa;;;QAuB5E;IAEF,MAAM,CAAC,wBAAwB,aAAc,QAAQ,gBAAgB,aAAa,yDAsBhF;IAEF,MAAM,CAAC,oBAAoB,aAAc,QAAQ,KAAG,wBAAwB,CAc1E;IAEF,MAAM,CAAC,uBAAuB,aAAc,QAAQ;;;QAalD;IAEF,MAAM,CAAC,2BAA2B,aAAc,QAAQ,4DAMtD;IAEF,MAAM,CAAC,kBAAkB,iBAAkB,MAAM,KAAG,gBAAgB,CAKlE;IAEF,MAAM,CAAC,kBAAkB;;;kBAAuC;IAEhE,OAAO,CAAC,MAAM,CAAC,yBAAyB;WA4C3B,IAAI,CAAC,QAAQ,EAAE,eAAe;IAiE3C,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC;WAalC,kBAAkB;IAQ/B,MAAM,CAAC,mBAAmB,CAAC,cAAc,GAAE,cAAyB,GAAG,IAAI;IAI3E,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,SAAS,GAAG,eAAe;IAEpD,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,GAAG,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC;IAU/E,MAAM,CAAC,YAAY,QAAS,eAAe,CAAC,KAAK,CAAC,aAC0B;IAG5E,MAAM,CAAC,eAAe,QAAS,eAAe,CAAC,KAAK,CAAC,aAA8B;IAGnF,MAAM,CAAC,eAAe,QAAS,eAAe,CAAC,KAAK,CAAC,aAAsB;CAC5E"}
|
package/dist/index.d.ts
CHANGED
|
@@ -184,6 +184,7 @@ type ConnectSettings = {
|
|
|
184
184
|
preRelease?: boolean;
|
|
185
185
|
fetchConfig?: boolean;
|
|
186
186
|
extension?: string;
|
|
187
|
+
configFetcher?: (url: string) => Promise<RemoteConfigResponse | null>;
|
|
187
188
|
};
|
|
188
189
|
type IVersionArray = [number, number, number];
|
|
189
190
|
type ILocale = 'zh-CN' | 'en-US';
|
|
@@ -223,8 +224,8 @@ type DeviceTypeMap = {
|
|
|
223
224
|
[k in IKnownDevice]: {
|
|
224
225
|
firmware: IFirmwareReleaseInfo[];
|
|
225
226
|
'firmware-v2'?: IFirmwareReleaseInfo[];
|
|
226
|
-
'firmware-
|
|
227
|
-
'firmware-btc-
|
|
227
|
+
'firmware-v8'?: IFirmwareReleaseInfo[];
|
|
228
|
+
'firmware-btc-v8'?: IFirmwareReleaseInfo[];
|
|
228
229
|
ble: IBLEFirmwareReleaseInfo[];
|
|
229
230
|
};
|
|
230
231
|
};
|
|
@@ -3240,7 +3241,7 @@ declare const getDeviceBLEFirmwareVersion: (features: Features) => IVersionArray
|
|
|
3240
3241
|
declare const getDeviceBootloaderVersion: (features: Features | undefined) => IVersionArray;
|
|
3241
3242
|
declare const getDeviceBoardloaderVersion: (features: Features) => IVersionArray;
|
|
3242
3243
|
|
|
3243
|
-
declare const FIRMWARE_FIELDS: readonly ["firmware", "firmware-v2", "firmware-
|
|
3244
|
+
declare const FIRMWARE_FIELDS: readonly ["firmware", "firmware-v2", "firmware-v8", "firmware-btc-v8"];
|
|
3244
3245
|
type IFirmwareField = (typeof FIRMWARE_FIELDS)[number];
|
|
3245
3246
|
type MessageVersion = 'latest' | 'v1';
|
|
3246
3247
|
declare class DataManager {
|
package/dist/index.js
CHANGED
|
@@ -787,7 +787,7 @@ const createLogMessage = (type, payload) => ({
|
|
|
787
787
|
|
|
788
788
|
const MAX_ENTRIES = 500;
|
|
789
789
|
let postMessage$1;
|
|
790
|
-
class Log$
|
|
790
|
+
class Log$g {
|
|
791
791
|
constructor(prefix, enabled) {
|
|
792
792
|
this.prefix = prefix;
|
|
793
793
|
this.enabled = enabled;
|
|
@@ -839,7 +839,7 @@ class Log$f {
|
|
|
839
839
|
}
|
|
840
840
|
const _logs = {};
|
|
841
841
|
const initLog = (prefix, enabled) => {
|
|
842
|
-
const instance = new Log$
|
|
842
|
+
const instance = new Log$g(prefix, !!enabled);
|
|
843
843
|
_logs[prefix] = instance;
|
|
844
844
|
return instance;
|
|
845
845
|
};
|
|
@@ -1035,7 +1035,7 @@ function patchFeatures(response) {
|
|
|
1035
1035
|
return response;
|
|
1036
1036
|
}
|
|
1037
1037
|
|
|
1038
|
-
const Log$
|
|
1038
|
+
const Log$f = getLogger(exports.LoggerNames.Core);
|
|
1039
1039
|
let globalInstanceCounter = 0;
|
|
1040
1040
|
let sdkInstanceCounter = 0;
|
|
1041
1041
|
function generateSdkInstanceId() {
|
|
@@ -1095,7 +1095,7 @@ function completeRequestContext(responseID, error) {
|
|
|
1095
1095
|
context.status = error ? 'error' : 'success';
|
|
1096
1096
|
if (error) {
|
|
1097
1097
|
context.error = error.message;
|
|
1098
|
-
Log$
|
|
1098
|
+
Log$f.error(`[RequestContext] [completeRequestContext] Error: ${formatRequestContext(context)}`);
|
|
1099
1099
|
}
|
|
1100
1100
|
globalActiveRequests.delete(responseID);
|
|
1101
1101
|
if (context.sdkInstanceId) {
|
|
@@ -25046,17 +25046,18 @@ const findLatestRelease = (releases) => {
|
|
|
25046
25046
|
};
|
|
25047
25047
|
|
|
25048
25048
|
var _a$1;
|
|
25049
|
+
const Log$e = getLogger(exports.LoggerNames.Core);
|
|
25049
25050
|
const FIRMWARE_FIELDS = [
|
|
25050
25051
|
'firmware',
|
|
25051
25052
|
'firmware-v2',
|
|
25052
|
-
'firmware-
|
|
25053
|
-
'firmware-btc-
|
|
25053
|
+
'firmware-v8',
|
|
25054
|
+
'firmware-btc-v8',
|
|
25054
25055
|
];
|
|
25055
25056
|
const FIRMWARE_FIELD_TYPE_MAP = {
|
|
25056
25057
|
firmware: hdShared.EFirmwareType.Universal,
|
|
25057
25058
|
'firmware-v2': hdShared.EFirmwareType.Universal,
|
|
25058
|
-
'firmware-
|
|
25059
|
-
'firmware-btc-
|
|
25059
|
+
'firmware-v8': hdShared.EFirmwareType.Universal,
|
|
25060
|
+
'firmware-btc-v8': hdShared.EFirmwareType.BitcoinOnly,
|
|
25060
25061
|
};
|
|
25061
25062
|
function getFirmwareTypeFromField(firmwareField) {
|
|
25062
25063
|
const firmwareType = FIRMWARE_FIELD_TYPE_MAP[firmwareField];
|
|
@@ -25100,13 +25101,44 @@ class DataManager {
|
|
|
25100
25101
|
if (!settings.fetchConfig) {
|
|
25101
25102
|
return;
|
|
25102
25103
|
}
|
|
25103
|
-
|
|
25104
|
-
|
|
25105
|
-
|
|
25106
|
-
|
|
25107
|
-
|
|
25108
|
-
|
|
25109
|
-
|
|
25104
|
+
const url = settings.preRelease
|
|
25105
|
+
? 'https://data.onekey.so/pre-config.json'
|
|
25106
|
+
: 'https://data.onekey.so/config.json';
|
|
25107
|
+
const urlWithCache = `${url}?noCache=${getTimeStamp()}`;
|
|
25108
|
+
let data = null;
|
|
25109
|
+
let fetchMethod = 'none';
|
|
25110
|
+
if (settings.configFetcher) {
|
|
25111
|
+
Log$e.debug('[DataConfig] Trying configFetcher (client-side fetcher)...');
|
|
25112
|
+
try {
|
|
25113
|
+
data = yield settings.configFetcher(urlWithCache);
|
|
25114
|
+
if (data) {
|
|
25115
|
+
fetchMethod = 'configFetcher';
|
|
25116
|
+
Log$e.log('[DataConfig] ConfigFetcher success');
|
|
25117
|
+
}
|
|
25118
|
+
else {
|
|
25119
|
+
Log$e.debug('[DataConfig] ConfigFetcher returned null, will fallback to axios');
|
|
25120
|
+
}
|
|
25121
|
+
}
|
|
25122
|
+
catch (e) {
|
|
25123
|
+
Log$e.warn('[DataConfig] ConfigFetcher error, will fallback to axios:', e);
|
|
25124
|
+
}
|
|
25125
|
+
}
|
|
25126
|
+
if (!data) {
|
|
25127
|
+
Log$e.debug('[DataConfig] Trying axios (SDK default fetcher)...');
|
|
25128
|
+
try {
|
|
25129
|
+
const response = yield axios__default["default"].get(urlWithCache, {
|
|
25130
|
+
timeout: 7000,
|
|
25131
|
+
});
|
|
25132
|
+
data = response.data;
|
|
25133
|
+
fetchMethod = 'axios';
|
|
25134
|
+
Log$e.log('[DataConfig] Axios fetch success');
|
|
25135
|
+
}
|
|
25136
|
+
catch (e) {
|
|
25137
|
+
Log$e.warn('[DataConfig] Axios fetch error:', e);
|
|
25138
|
+
}
|
|
25139
|
+
}
|
|
25140
|
+
if (data) {
|
|
25141
|
+
Log$e.log(`[DataConfig] Config loaded successfully via [${fetchMethod}]`);
|
|
25110
25142
|
this.deviceMap = {
|
|
25111
25143
|
[hdShared.EDeviceType.Classic]: this.enrichFirmwareReleaseInfo(data.classic),
|
|
25112
25144
|
[hdShared.EDeviceType.Classic1s]: this.enrichFirmwareReleaseInfo(data.classic1s),
|
|
@@ -25119,7 +25151,8 @@ class DataManager {
|
|
|
25119
25151
|
bridge: data.bridge,
|
|
25120
25152
|
};
|
|
25121
25153
|
}
|
|
25122
|
-
|
|
25154
|
+
else {
|
|
25155
|
+
Log$e.warn('[DataConfig] All fetch methods failed, using built-in default config');
|
|
25123
25156
|
}
|
|
25124
25157
|
});
|
|
25125
25158
|
}
|
|
@@ -25528,9 +25561,9 @@ const supportModifyHomescreen = (features) => {
|
|
|
25528
25561
|
};
|
|
25529
25562
|
const getLatestFirmwareField = (firmwareType) => {
|
|
25530
25563
|
if (firmwareType === 'bitcoinonly') {
|
|
25531
|
-
return `firmware-btc-
|
|
25564
|
+
return `firmware-btc-v8`;
|
|
25532
25565
|
}
|
|
25533
|
-
return `firmware-
|
|
25566
|
+
return `firmware-v8`;
|
|
25534
25567
|
};
|
|
25535
25568
|
const getFirmwareUpdateField = ({ features, updateType, targetVersion, firmwareType, }) => {
|
|
25536
25569
|
const deviceType = getDeviceType(features);
|
|
@@ -25567,23 +25600,23 @@ const getFirmwareUpdateFieldArray = (features, updateType) => {
|
|
|
25567
25600
|
deviceType === 'classic1s' ||
|
|
25568
25601
|
deviceType === 'mini' ||
|
|
25569
25602
|
deviceType === 'classicpure') {
|
|
25570
|
-
return ['firmware-
|
|
25603
|
+
return ['firmware-v8'];
|
|
25571
25604
|
}
|
|
25572
25605
|
if (deviceType === 'touch') {
|
|
25573
25606
|
const currentVersion = getDeviceFirmwareVersion(features).join('.');
|
|
25574
25607
|
if (semver__default["default"].gt(currentVersion, '4.0.0')) {
|
|
25575
|
-
return ['firmware-
|
|
25608
|
+
return ['firmware-v8', 'firmware'];
|
|
25576
25609
|
}
|
|
25577
25610
|
if (semver__default["default"].gte(currentVersion, '4.0.0')) {
|
|
25578
25611
|
return ['firmware-v2', 'firmware'];
|
|
25579
25612
|
}
|
|
25580
25613
|
if (!currentVersion || semver__default["default"].lt(currentVersion, '3.0.0')) {
|
|
25581
|
-
return ['firmware-
|
|
25614
|
+
return ['firmware-v8', 'firmware-v2', 'firmware'];
|
|
25582
25615
|
}
|
|
25583
25616
|
return ['firmware'];
|
|
25584
25617
|
}
|
|
25585
25618
|
if (deviceType === 'pro') {
|
|
25586
|
-
return ['firmware-
|
|
25619
|
+
return ['firmware-v8'];
|
|
25587
25620
|
}
|
|
25588
25621
|
return ['firmware'];
|
|
25589
25622
|
};
|
|
@@ -29336,6 +29369,7 @@ class FirmwareUpdateBaseMethod extends BaseMethod {
|
|
|
29336
29369
|
constructor() {
|
|
29337
29370
|
super(...arguments);
|
|
29338
29371
|
this.checkPromise = null;
|
|
29372
|
+
this.hasPromptedWebUsbBootloaderReauth = false;
|
|
29339
29373
|
this.postTipMessage = (message) => {
|
|
29340
29374
|
this.postMessage(createUiMessage(UI_REQUEST.FIRMWARE_TIP, {
|
|
29341
29375
|
device: this.device.toMessageObject(),
|
|
@@ -29414,7 +29448,7 @@ class FirmwareUpdateBaseMethod extends BaseMethod {
|
|
|
29414
29448
|
}
|
|
29415
29449
|
}
|
|
29416
29450
|
catch (e) {
|
|
29417
|
-
Log$7.log('FirmwareUpdateBaseMethod [checkDeviceToBootloader]
|
|
29451
|
+
Log$7.log('FirmwareUpdateBaseMethod [checkDeviceToBootloader] _promptDeviceInBootloaderForWebDevice failed: ', e);
|
|
29418
29452
|
(_c = this.checkPromise) === null || _c === void 0 ? void 0 : _c.reject(e);
|
|
29419
29453
|
}
|
|
29420
29454
|
return;
|
|
@@ -29443,6 +29477,23 @@ class FirmwareUpdateBaseMethod extends BaseMethod {
|
|
|
29443
29477
|
}
|
|
29444
29478
|
}, 30000);
|
|
29445
29479
|
}
|
|
29480
|
+
ensureWebUsbBootloaderReauthPrompt() {
|
|
29481
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
29482
|
+
if (this.hasPromptedWebUsbBootloaderReauth ||
|
|
29483
|
+
!DataManager.isBrowserWebUsb(DataManager.getSettings('env')) ||
|
|
29484
|
+
this.device.listenerCount(DEVICE.SELECT_DEVICE_IN_BOOTLOADER_FOR_WEB_DEVICE) === 0) {
|
|
29485
|
+
return;
|
|
29486
|
+
}
|
|
29487
|
+
this.hasPromptedWebUsbBootloaderReauth = true;
|
|
29488
|
+
this.postTipMessage(exports.FirmwareUpdateTipMessage.SelectDeviceInBootloaderForWebDevice);
|
|
29489
|
+
try {
|
|
29490
|
+
yield this._promptDeviceInBootloaderForWebDevice();
|
|
29491
|
+
}
|
|
29492
|
+
catch (error) {
|
|
29493
|
+
Log$7.log('WebUSB 设备重新授权失败: ', error);
|
|
29494
|
+
}
|
|
29495
|
+
});
|
|
29496
|
+
}
|
|
29446
29497
|
_checkDeviceInBootloaderMode(connectId, intervalTimer, timeoutTimer) {
|
|
29447
29498
|
var _a, _b, _c, _d, _e;
|
|
29448
29499
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -30369,7 +30420,6 @@ class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod {
|
|
|
30369
30420
|
});
|
|
30370
30421
|
}
|
|
30371
30422
|
executeUpdate({ resourceBinary, fwBinaryMap, bootloaderBinary, }) {
|
|
30372
|
-
var _a;
|
|
30373
30423
|
return __awaiter(this, void 0, void 0, function* () {
|
|
30374
30424
|
let totalSize = 0;
|
|
30375
30425
|
let processedSize = 0;
|
|
@@ -30470,33 +30520,82 @@ class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod {
|
|
|
30470
30520
|
const bootloaderVersion = getDeviceBootloaderVersion(features).join('.');
|
|
30471
30521
|
const bleVersion = getDeviceBLEFirmwareVersion(features).join('.');
|
|
30472
30522
|
const firmwareVersion = getDeviceFirmwareVersion(features).join('.');
|
|
30473
|
-
|
|
30474
|
-
|
|
30475
|
-
|
|
30476
|
-
|
|
30477
|
-
|
|
30478
|
-
|
|
30479
|
-
|
|
30523
|
+
if (firmwareVersion !== '0.0.0') {
|
|
30524
|
+
this.postTipMessage(exports.FirmwareUpdateTipMessage.FirmwareUpdateCompleted);
|
|
30525
|
+
DevicePool.resetState();
|
|
30526
|
+
return {
|
|
30527
|
+
bootloaderVersion,
|
|
30528
|
+
bleVersion,
|
|
30529
|
+
firmwareVersion,
|
|
30530
|
+
};
|
|
30531
|
+
}
|
|
30532
|
+
yield hdShared.wait(1000);
|
|
30480
30533
|
}
|
|
30481
30534
|
catch (error) {
|
|
30482
|
-
|
|
30483
|
-
|
|
30484
|
-
const progressValue = (_a = updateParts[1]) !== null && _a !== void 0 ? _a : '0';
|
|
30485
|
-
const progress = parseInt(progressValue, 10) || 0;
|
|
30535
|
+
const progress = this.extractUpdateModeProgress(error);
|
|
30536
|
+
if (progress !== null) {
|
|
30486
30537
|
this.postProgressMessage(progress, 'installingFirmware');
|
|
30487
30538
|
yield hdShared.wait(1000);
|
|
30488
30539
|
}
|
|
30489
30540
|
else {
|
|
30490
30541
|
yield hdShared.wait(1000);
|
|
30491
|
-
|
|
30492
|
-
|
|
30493
|
-
|
|
30494
|
-
|
|
30542
|
+
if (!this.shouldSkipReconnect(error)) {
|
|
30543
|
+
const reconnectTimeout = this.isBleReconnect() && (this.params.bleBinary || this.params.bleVersion)
|
|
30544
|
+
? 3 * 60 * 1000
|
|
30545
|
+
: 60 * 1000;
|
|
30546
|
+
yield this.ensureWebUsbBootloaderReauthPrompt();
|
|
30547
|
+
yield this.waitForDeviceReconnect(reconnectTimeout);
|
|
30548
|
+
}
|
|
30495
30549
|
}
|
|
30496
30550
|
}
|
|
30497
30551
|
}
|
|
30498
30552
|
});
|
|
30499
30553
|
}
|
|
30554
|
+
extractUpdateModeProgress(error) {
|
|
30555
|
+
const message = this.normalizeErrorMessage(error);
|
|
30556
|
+
if (!message) {
|
|
30557
|
+
return null;
|
|
30558
|
+
}
|
|
30559
|
+
const match = message.match(/Update mode\s*(\d+)/i);
|
|
30560
|
+
if (!match) {
|
|
30561
|
+
return null;
|
|
30562
|
+
}
|
|
30563
|
+
const progress = parseInt(match[1], 10);
|
|
30564
|
+
return Number.isNaN(progress) ? null : progress;
|
|
30565
|
+
}
|
|
30566
|
+
shouldSkipReconnect(error) {
|
|
30567
|
+
const message = this.normalizeErrorMessage(error);
|
|
30568
|
+
if (!message) {
|
|
30569
|
+
return false;
|
|
30570
|
+
}
|
|
30571
|
+
const normalized = message.toLowerCase();
|
|
30572
|
+
const transientKeywords = [
|
|
30573
|
+
'operation was cancelled',
|
|
30574
|
+
'force clean bluetooth run promise',
|
|
30575
|
+
'getfeatures timeout',
|
|
30576
|
+
'timeout after 3 seconds',
|
|
30577
|
+
'transport cancel',
|
|
30578
|
+
];
|
|
30579
|
+
return transientKeywords.some(keyword => normalized.includes(keyword));
|
|
30580
|
+
}
|
|
30581
|
+
normalizeErrorMessage(error) {
|
|
30582
|
+
if (!error) {
|
|
30583
|
+
return '';
|
|
30584
|
+
}
|
|
30585
|
+
if (typeof error === 'string') {
|
|
30586
|
+
return error;
|
|
30587
|
+
}
|
|
30588
|
+
if (typeof error === 'object') {
|
|
30589
|
+
const { message } = error;
|
|
30590
|
+
if (typeof message === 'string') {
|
|
30591
|
+
return message;
|
|
30592
|
+
}
|
|
30593
|
+
if (message !== undefined && message !== null) {
|
|
30594
|
+
return String(message);
|
|
30595
|
+
}
|
|
30596
|
+
}
|
|
30597
|
+
return '';
|
|
30598
|
+
}
|
|
30500
30599
|
waitForDeviceReconnect(timeout) {
|
|
30501
30600
|
var _a, _b, _c, _d;
|
|
30502
30601
|
return __awaiter(this, void 0, void 0, function* () {
|
package/dist/types/settings.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ export type ConnectSettings = {
|
|
|
20
20
|
preRelease?: boolean;
|
|
21
21
|
fetchConfig?: boolean;
|
|
22
22
|
extension?: string;
|
|
23
|
+
configFetcher?: (url: string) => Promise<RemoteConfigResponse | null>;
|
|
23
24
|
};
|
|
24
25
|
export type IVersionArray = [number, number, number];
|
|
25
26
|
export type ILocale = 'zh-CN' | 'en-US';
|
|
@@ -59,8 +60,8 @@ export type DeviceTypeMap = {
|
|
|
59
60
|
[k in IKnownDevice]: {
|
|
60
61
|
firmware: IFirmwareReleaseInfo[];
|
|
61
62
|
'firmware-v2'?: IFirmwareReleaseInfo[];
|
|
62
|
-
'firmware-
|
|
63
|
-
'firmware-btc-
|
|
63
|
+
'firmware-v8'?: IFirmwareReleaseInfo[];
|
|
64
|
+
'firmware-btc-v8'?: IFirmwareReleaseInfo[];
|
|
64
65
|
ble: IBLEFirmwareReleaseInfo[];
|
|
65
66
|
};
|
|
66
67
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/types/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,KAAK,GACL,cAAc,GACd,UAAU,GACV,cAAc,GACd,QAAQ,GACR,gBAAgB,GAChB,iBAAiB,GACjB,UAAU,GACV,UAAU,CAAC;AACf,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,GAAG,EAAE,YAAY,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/types/settings.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onekeyfe/hd-core",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.21-alpha.0",
|
|
4
4
|
"description": "Core processes and APIs for communicating with OneKey hardware devices.",
|
|
5
5
|
"author": "OneKey",
|
|
6
6
|
"homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
"url": "https://github.com/OneKeyHQ/hardware-js-sdk/issues"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@onekeyfe/hd-shared": "1.1.
|
|
29
|
-
"@onekeyfe/hd-transport": "1.1.
|
|
28
|
+
"@onekeyfe/hd-shared": "1.1.21-alpha.0",
|
|
29
|
+
"@onekeyfe/hd-transport": "1.1.21-alpha.0",
|
|
30
30
|
"axios": "1.12.2",
|
|
31
31
|
"bignumber.js": "^9.0.2",
|
|
32
32
|
"bytebuffer": "^5.0.1",
|
|
@@ -44,5 +44,5 @@
|
|
|
44
44
|
"@types/w3c-web-usb": "^1.0.10",
|
|
45
45
|
"@types/web-bluetooth": "^0.0.21"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "07cd6d68356b267de165368bba5168ae319ff5fa"
|
|
48
48
|
}
|
|
@@ -247,7 +247,7 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
247
247
|
}
|
|
248
248
|
|
|
249
249
|
this.postTipMessage(FirmwareUpdateTipMessage.StartTransferData);
|
|
250
|
-
//
|
|
250
|
+
// Process resource zip contents
|
|
251
251
|
if (resourceBinary) {
|
|
252
252
|
const file = await JSZip.loadAsync(resourceBinary);
|
|
253
253
|
const files = Object.entries(file.files);
|
|
@@ -358,39 +358,98 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
358
358
|
const bootloaderVersion = getDeviceBootloaderVersion(features).join('.');
|
|
359
359
|
const bleVersion = getDeviceBLEFirmwareVersion(features).join('.');
|
|
360
360
|
const firmwareVersion = getDeviceFirmwareVersion(features).join('.');
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
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);
|
|
368
373
|
} catch (error) {
|
|
369
|
-
|
|
370
|
-
if (
|
|
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) {
|
|
374
376
|
this.postProgressMessage(progress, 'installingFirmware');
|
|
375
377
|
await wait(1000);
|
|
376
378
|
} else {
|
|
377
379
|
await wait(1000);
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
380
|
+
if (!this.shouldSkipReconnect(error)) {
|
|
381
|
+
/**
|
|
382
|
+
* Needs second reconnect case:
|
|
383
|
+
* 1. While including 'Ble firmwware' in ble connect type
|
|
384
|
+
* 2. While including bootloader upgrade
|
|
385
|
+
*/
|
|
386
|
+
const reconnectTimeout =
|
|
387
|
+
this.isBleReconnect() && (this.params.bleBinary || this.params.bleVersion)
|
|
388
|
+
? 3 * 60 * 1000 // 3 minutes for BLE reconnect
|
|
389
|
+
: 60 * 1000; // 1 minute for normal reconnect
|
|
390
|
+
|
|
391
|
+
await this.ensureWebUsbBootloaderReauthPrompt();
|
|
392
|
+
await this.waitForDeviceReconnect(reconnectTimeout);
|
|
393
|
+
}
|
|
389
394
|
}
|
|
390
395
|
}
|
|
391
396
|
}
|
|
392
397
|
}
|
|
393
398
|
|
|
399
|
+
/**
|
|
400
|
+
* Parse “Update mode XX” progress value from device errors to avoid hardcoded message.includes.
|
|
401
|
+
*/
|
|
402
|
+
private extractUpdateModeProgress(error: unknown): number | null {
|
|
403
|
+
const message = this.normalizeErrorMessage(error);
|
|
404
|
+
if (!message) {
|
|
405
|
+
return null;
|
|
406
|
+
}
|
|
407
|
+
const match = message.match(/Update mode\s*(\d+)/i);
|
|
408
|
+
if (!match) {
|
|
409
|
+
return null;
|
|
410
|
+
}
|
|
411
|
+
const progress = parseInt(match[1], 10);
|
|
412
|
+
return Number.isNaN(progress) ? null : progress;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Check whether the error is a transient BLE reconnect/timeout hint (e.g., force clean/cancel).
|
|
417
|
+
*/
|
|
418
|
+
private shouldSkipReconnect(error: unknown): boolean {
|
|
419
|
+
const message = this.normalizeErrorMessage(error);
|
|
420
|
+
if (!message) {
|
|
421
|
+
return false;
|
|
422
|
+
}
|
|
423
|
+
const normalized = message.toLowerCase();
|
|
424
|
+
const transientKeywords = [
|
|
425
|
+
'operation was cancelled',
|
|
426
|
+
'force clean bluetooth run promise',
|
|
427
|
+
'getfeatures timeout',
|
|
428
|
+
'timeout after 3 seconds',
|
|
429
|
+
'transport cancel',
|
|
430
|
+
];
|
|
431
|
+
return transientKeywords.some(keyword => normalized.includes(keyword));
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
private normalizeErrorMessage(error: unknown): string {
|
|
435
|
+
if (!error) {
|
|
436
|
+
return '';
|
|
437
|
+
}
|
|
438
|
+
if (typeof error === 'string') {
|
|
439
|
+
return error;
|
|
440
|
+
}
|
|
441
|
+
if (typeof error === 'object') {
|
|
442
|
+
const { message } = error as { message?: unknown };
|
|
443
|
+
if (typeof message === 'string') {
|
|
444
|
+
return message;
|
|
445
|
+
}
|
|
446
|
+
if (message !== undefined && message !== null) {
|
|
447
|
+
return String(message);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
return '';
|
|
451
|
+
}
|
|
452
|
+
|
|
394
453
|
/**
|
|
395
454
|
* @description Reconnect device - While update with bootloader, it will reconnect device
|
|
396
455
|
* @param {number} timeout - The timeout for the reconnection
|
|
@@ -40,6 +40,8 @@ const isDeviceDisconnectedError = (error: unknown) => {
|
|
|
40
40
|
export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
|
|
41
41
|
checkPromise: Deferred<any> | null = null;
|
|
42
42
|
|
|
43
|
+
protected hasPromptedWebUsbBootloaderReauth = false;
|
|
44
|
+
|
|
43
45
|
init(): void {}
|
|
44
46
|
|
|
45
47
|
run(): Promise<any> {
|
|
@@ -153,7 +155,7 @@ export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
|
|
|
153
155
|
}
|
|
154
156
|
} catch (e) {
|
|
155
157
|
Log.log(
|
|
156
|
-
'FirmwareUpdateBaseMethod [checkDeviceToBootloader]
|
|
158
|
+
'FirmwareUpdateBaseMethod [checkDeviceToBootloader] _promptDeviceInBootloaderForWebDevice failed: ',
|
|
157
159
|
e
|
|
158
160
|
);
|
|
159
161
|
this.checkPromise?.reject(e);
|
|
@@ -193,6 +195,29 @@ export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
|
|
|
193
195
|
}, 30000);
|
|
194
196
|
}
|
|
195
197
|
|
|
198
|
+
/**
|
|
199
|
+
* 仅在 firmware 被抹掉、需要重新授权的 bootloader 场景下才提示 WebUSB
|
|
200
|
+
* (比如 BTC-only 与通用固件互转后算作新设备)。
|
|
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 设备重新授权失败: ', error);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
196
221
|
private async _checkDeviceInBootloaderMode(
|
|
197
222
|
connectId: string | undefined,
|
|
198
223
|
intervalTimer?: ReturnType<typeof setInterval>,
|
|
@@ -5,11 +5,13 @@ import { EDeviceType, EFirmwareType } from '@onekeyfe/hd-shared';
|
|
|
5
5
|
import MessagesJSON from '../data/messages/messages.json';
|
|
6
6
|
import MessagesLegacyV1JSON from '../data/messages/messages_legacy_v1.json';
|
|
7
7
|
import {
|
|
8
|
+
LoggerNames,
|
|
8
9
|
getDeviceBLEFirmwareVersion,
|
|
9
10
|
getDeviceFirmwareVersion,
|
|
10
11
|
getDeviceType,
|
|
11
12
|
getFirmwareType,
|
|
12
13
|
getFirmwareUpdateField,
|
|
14
|
+
getLogger,
|
|
13
15
|
getTimeStamp,
|
|
14
16
|
} from '../utils';
|
|
15
17
|
import { DeviceModelToTypes } from '../types';
|
|
@@ -27,11 +29,13 @@ import type {
|
|
|
27
29
|
RemoteConfigResponse,
|
|
28
30
|
} from '../types';
|
|
29
31
|
|
|
32
|
+
const Log = getLogger(LoggerNames.Core);
|
|
33
|
+
|
|
30
34
|
export const FIRMWARE_FIELDS = [
|
|
31
35
|
'firmware',
|
|
32
36
|
'firmware-v2',
|
|
33
|
-
'firmware-
|
|
34
|
-
'firmware-btc-
|
|
37
|
+
'firmware-v8',
|
|
38
|
+
'firmware-btc-v8',
|
|
35
39
|
] as const;
|
|
36
40
|
|
|
37
41
|
export type IFirmwareField = (typeof FIRMWARE_FIELDS)[number];
|
|
@@ -41,8 +45,8 @@ export type MessageVersion = 'latest' | 'v1';
|
|
|
41
45
|
const FIRMWARE_FIELD_TYPE_MAP: Readonly<Record<IFirmwareField, EFirmwareType>> = {
|
|
42
46
|
firmware: EFirmwareType.Universal,
|
|
43
47
|
'firmware-v2': EFirmwareType.Universal,
|
|
44
|
-
'firmware-
|
|
45
|
-
'firmware-btc-
|
|
48
|
+
'firmware-v8': EFirmwareType.Universal,
|
|
49
|
+
'firmware-btc-v8': EFirmwareType.BitcoinOnly,
|
|
46
50
|
} as const;
|
|
47
51
|
|
|
48
52
|
function getFirmwareTypeFromField(firmwareField: IFirmwareField): EFirmwareType {
|
|
@@ -387,18 +391,50 @@ export default class DataManager {
|
|
|
387
391
|
if (!settings.fetchConfig) {
|
|
388
392
|
return;
|
|
389
393
|
}
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
394
|
+
|
|
395
|
+
const url = settings.preRelease
|
|
396
|
+
? 'https://data.onekey.so/pre-config.json'
|
|
397
|
+
: 'https://data.onekey.so/config.json';
|
|
398
|
+
|
|
399
|
+
const urlWithCache = `${url}?noCache=${getTimeStamp()}`;
|
|
400
|
+
let data: RemoteConfigResponse | null = null;
|
|
401
|
+
let fetchMethod: 'configFetcher' | 'axios' | 'none' = 'none';
|
|
402
|
+
|
|
403
|
+
// 1. Try custom configFetcher first (client-side IP direct connection support)
|
|
404
|
+
if (settings.configFetcher) {
|
|
405
|
+
Log.debug('[DataConfig] Trying configFetcher (client-side fetcher)...');
|
|
406
|
+
try {
|
|
407
|
+
data = await settings.configFetcher(urlWithCache);
|
|
408
|
+
if (data) {
|
|
409
|
+
fetchMethod = 'configFetcher';
|
|
410
|
+
Log.log('[DataConfig] ConfigFetcher success');
|
|
411
|
+
} else {
|
|
412
|
+
Log.debug('[DataConfig] ConfigFetcher returned null, will fallback to axios');
|
|
400
413
|
}
|
|
401
|
-
)
|
|
414
|
+
} catch (e) {
|
|
415
|
+
Log.warn('[DataConfig] ConfigFetcher error, will fallback to axios:', e);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
// 2. Fallback to default axios request
|
|
420
|
+
if (!data) {
|
|
421
|
+
Log.debug('[DataConfig] Trying axios (SDK default fetcher)...');
|
|
422
|
+
try {
|
|
423
|
+
const response = await axios.get<RemoteConfigResponse>(urlWithCache, {
|
|
424
|
+
// because of iframe timeout is 10000
|
|
425
|
+
timeout: 7000,
|
|
426
|
+
});
|
|
427
|
+
data = response.data;
|
|
428
|
+
fetchMethod = 'axios';
|
|
429
|
+
Log.log('[DataConfig] Axios fetch success');
|
|
430
|
+
} catch (e) {
|
|
431
|
+
Log.warn('[DataConfig] Axios fetch error:', e);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// 3. Apply config if available
|
|
436
|
+
if (data) {
|
|
437
|
+
Log.log(`[DataConfig] Config loaded successfully via [${fetchMethod}]`);
|
|
402
438
|
this.deviceMap = {
|
|
403
439
|
[EDeviceType.Classic]: this.enrichFirmwareReleaseInfo(data.classic),
|
|
404
440
|
[EDeviceType.Classic1s]: this.enrichFirmwareReleaseInfo(data.classic1s),
|
|
@@ -410,8 +446,8 @@ export default class DataManager {
|
|
|
410
446
|
this.assets = {
|
|
411
447
|
bridge: data.bridge,
|
|
412
448
|
};
|
|
413
|
-
}
|
|
414
|
-
|
|
449
|
+
} else {
|
|
450
|
+
Log.warn('[DataConfig] All fetch methods failed, using built-in default config');
|
|
415
451
|
}
|
|
416
452
|
}
|
|
417
453
|
|
package/src/types/settings.ts
CHANGED
|
@@ -32,6 +32,7 @@ export type ConnectSettings = {
|
|
|
32
32
|
preRelease?: boolean;
|
|
33
33
|
fetchConfig?: boolean;
|
|
34
34
|
extension?: string;
|
|
35
|
+
configFetcher?: (url: string) => Promise<RemoteConfigResponse | null>;
|
|
35
36
|
};
|
|
36
37
|
|
|
37
38
|
export type IVersionArray = [number, number, number];
|
|
@@ -97,9 +98,9 @@ type IKnownDevice = Exclude<IDeviceType, 'unknown'>;
|
|
|
97
98
|
* // {
|
|
98
99
|
* // firmware: IFirmwareReleaseInfo[];
|
|
99
100
|
* // 'firmware-v2'?: IFirmwareReleaseInfo[];
|
|
100
|
-
* // 'firmware-
|
|
101
|
+
* // 'firmware-v8'?: IFirmwareReleaseInfo[];
|
|
101
102
|
* // 'firmware-v8'?: IFirmwareReleaseInfo[]; // New
|
|
102
|
-
* // 'firmware-btc-
|
|
103
|
+
* // 'firmware-btc-v8'?: IFirmwareReleaseInfo[];
|
|
103
104
|
* // 'firmware-btc-v8'?: IFirmwareReleaseInfo[]; // New
|
|
104
105
|
* // ble: IBLEFirmwareReleaseInfo[];
|
|
105
106
|
* // }
|
|
@@ -111,9 +112,9 @@ export type DeviceTypeMap = {
|
|
|
111
112
|
/** Firmware v2 (Touch/Pro specific) */
|
|
112
113
|
'firmware-v2'?: IFirmwareReleaseInfo[];
|
|
113
114
|
/** Universal firmware v7 */
|
|
114
|
-
'firmware-
|
|
115
|
+
'firmware-v8'?: IFirmwareReleaseInfo[];
|
|
115
116
|
/** Bitcoin-only firmware v7 */
|
|
116
|
-
'firmware-btc-
|
|
117
|
+
'firmware-btc-v8'?: IFirmwareReleaseInfo[];
|
|
117
118
|
// Future firmware versions should be added here as optional fields:
|
|
118
119
|
// 'firmware-v8'?: IFirmwareReleaseInfo[];
|
|
119
120
|
// 'firmware-btc-v8'?: IFirmwareReleaseInfo[];
|
|
@@ -235,9 +235,9 @@ export const supportModifyHomescreen = (features?: Features): SupportFeatureType
|
|
|
235
235
|
|
|
236
236
|
export const getLatestFirmwareField = (firmwareType?: EFirmwareType): IFirmwareField => {
|
|
237
237
|
if (firmwareType === 'bitcoinonly') {
|
|
238
|
-
return `firmware-btc-
|
|
238
|
+
return `firmware-btc-v8`;
|
|
239
239
|
}
|
|
240
|
-
return `firmware-
|
|
240
|
+
return `firmware-v8`;
|
|
241
241
|
};
|
|
242
242
|
|
|
243
243
|
/**
|
|
@@ -300,25 +300,25 @@ export const getFirmwareUpdateFieldArray = (
|
|
|
300
300
|
deviceType === 'mini' ||
|
|
301
301
|
deviceType === 'classicpure'
|
|
302
302
|
) {
|
|
303
|
-
return ['firmware-
|
|
303
|
+
return ['firmware-v8'];
|
|
304
304
|
}
|
|
305
305
|
|
|
306
306
|
if (deviceType === 'touch') {
|
|
307
307
|
const currentVersion = getDeviceFirmwareVersion(features).join('.');
|
|
308
308
|
if (semver.gt(currentVersion, '4.0.0')) {
|
|
309
|
-
return ['firmware-
|
|
309
|
+
return ['firmware-v8', 'firmware'];
|
|
310
310
|
}
|
|
311
311
|
if (semver.gte(currentVersion, '4.0.0')) {
|
|
312
312
|
return ['firmware-v2', 'firmware'];
|
|
313
313
|
}
|
|
314
314
|
if (!currentVersion || semver.lt(currentVersion, '3.0.0')) {
|
|
315
|
-
return ['firmware-
|
|
315
|
+
return ['firmware-v8', 'firmware-v2', 'firmware'];
|
|
316
316
|
}
|
|
317
317
|
return ['firmware'];
|
|
318
318
|
}
|
|
319
319
|
|
|
320
320
|
if (deviceType === 'pro') {
|
|
321
|
-
return ['firmware-
|
|
321
|
+
return ['firmware-v8'];
|
|
322
322
|
}
|
|
323
323
|
|
|
324
324
|
return ['firmware'];
|