@onekeyfe/hd-core 1.2.6-alpha.3 → 1.2.6
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__/core-error-output.test.ts +0 -111
- package/__tests__/device-state-mapper.test.ts +15 -4
- package/__tests__/firmware-update/firmware-update-v4-install-poll.test.ts +9 -1
- package/__tests__/firmware-update/firmware-update-v4-optional-versions.test.ts +166 -0
- package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
- package/dist/api/UploadPortfolio.d.ts +0 -5
- package/dist/api/UploadPortfolio.d.ts.map +1 -1
- package/dist/device/DeviceStateMapper.d.ts.map +1 -1
- package/dist/index.js +16 -11
- package/package.json +4 -4
- package/src/api/FirmwareUpdateV4.ts +10 -7
- package/src/api/UploadPortfolio.ts +0 -5
- package/src/device/DeviceStateMapper.ts +11 -3
|
@@ -6,8 +6,6 @@ import TransportManager from '../src/data-manager/TransportManager';
|
|
|
6
6
|
import { IFRAME } from '../src/events';
|
|
7
7
|
import SearchDevices from '../src/api/SearchDevices';
|
|
8
8
|
import { DeviceList } from '../src/device/DeviceList';
|
|
9
|
-
import { Device } from '../src/device/Device';
|
|
10
|
-
import { DevicePool } from '../src/device/DevicePool';
|
|
11
9
|
|
|
12
10
|
jest.mock('../src/data/config', () => ({
|
|
13
11
|
getSDKVersion: jest.fn(() => '1.0.0-test'),
|
|
@@ -207,112 +205,3 @@ describe('Core 错误输出边界', () => {
|
|
|
207
205
|
await core.dispose();
|
|
208
206
|
});
|
|
209
207
|
});
|
|
210
|
-
|
|
211
|
-
describe('Portfolio firmware compatibility through Core', () => {
|
|
212
|
-
afterEach(() => {
|
|
213
|
-
jest.restoreAllMocks();
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
test.each(
|
|
217
|
-
(['pro2', 'neo'] as const).flatMap(deviceType =>
|
|
218
|
-
(['silent', 'progress'] as const).map(uiMode => ({ deviceType, uiMode }))
|
|
219
|
-
)
|
|
220
|
-
)(
|
|
221
|
-
'checks the current $deviceType firmware before a $uiMode upload',
|
|
222
|
-
async ({ deviceType, uiMode }) => {
|
|
223
|
-
DevicePool.resetState();
|
|
224
|
-
jest.spyOn(DataManager, 'getSettings').mockReturnValue('react-native' as never);
|
|
225
|
-
const device = Device.fromDescriptor({
|
|
226
|
-
id: 'portfolio-device',
|
|
227
|
-
path: 'portfolio-device',
|
|
228
|
-
commType: 'ble',
|
|
229
|
-
protocolType: 'V2',
|
|
230
|
-
} as never);
|
|
231
|
-
jest.spyOn(Device, 'fromDescriptor').mockReturnValue(device);
|
|
232
|
-
jest.spyOn(device, 'acquire').mockResolvedValue(undefined);
|
|
233
|
-
jest.spyOn(device, 'initialize').mockResolvedValue(undefined);
|
|
234
|
-
jest.spyOn(device, 'release').mockResolvedValue(undefined);
|
|
235
|
-
jest.spyOn(device, 'ensureProtocolV2RuntimeContext').mockResolvedValue({
|
|
236
|
-
version: 2,
|
|
237
|
-
supported_messages: [60805, 61400],
|
|
238
|
-
});
|
|
239
|
-
const typedCall = jest.fn();
|
|
240
|
-
device.commands = {
|
|
241
|
-
typedCall,
|
|
242
|
-
disposed: false,
|
|
243
|
-
dispose: jest.fn(),
|
|
244
|
-
checkDisposed: jest.fn(),
|
|
245
|
-
} as never;
|
|
246
|
-
const core = initCore();
|
|
247
|
-
let id = 0;
|
|
248
|
-
const upload = () =>
|
|
249
|
-
core.handleMessage({
|
|
250
|
-
id: ++id,
|
|
251
|
-
type: IFRAME.CALL,
|
|
252
|
-
payload: {
|
|
253
|
-
method: 'uploadPortfolio',
|
|
254
|
-
connectId: 'portfolio-device',
|
|
255
|
-
connectProtocol: 'V2',
|
|
256
|
-
packageBase64: 'AQID',
|
|
257
|
-
uiMode,
|
|
258
|
-
},
|
|
259
|
-
} as never);
|
|
260
|
-
|
|
261
|
-
try {
|
|
262
|
-
// Reuse one device across version changes to cover a retry after upgrading.
|
|
263
|
-
for (const firmwareVersion of ['1.0.1', '1.0.2', '1.0.3', '1.0.10']) {
|
|
264
|
-
device.features = {
|
|
265
|
-
protocol: 'V2',
|
|
266
|
-
deviceType,
|
|
267
|
-
firmwareType: 'universal',
|
|
268
|
-
firmwareVersion,
|
|
269
|
-
mode: 'normal',
|
|
270
|
-
initialized: true,
|
|
271
|
-
bootloaderMode: false,
|
|
272
|
-
capabilities: [],
|
|
273
|
-
} as never;
|
|
274
|
-
typedCall.mockReset();
|
|
275
|
-
typedCall
|
|
276
|
-
.mockResolvedValueOnce({ message: { processed_byte: 3 } })
|
|
277
|
-
.mockResolvedValueOnce({ message: { message: 'Portfolio updated' } });
|
|
278
|
-
|
|
279
|
-
const response = await upload();
|
|
280
|
-
if (firmwareVersion === '1.0.1' || firmwareVersion === '1.0.2') {
|
|
281
|
-
expect(response).toMatchObject({
|
|
282
|
-
success: false,
|
|
283
|
-
payload: {
|
|
284
|
-
code: HardwareErrorCode.CallMethodNeedUpgradeFirmware,
|
|
285
|
-
params: { current: firmwareVersion, require: '1.0.3', method: 'uploadPortfolio' },
|
|
286
|
-
},
|
|
287
|
-
});
|
|
288
|
-
expect(typedCall).not.toHaveBeenCalled();
|
|
289
|
-
} else {
|
|
290
|
-
expect(response).toMatchObject({ success: true, payload: { portfolioUpdated: true } });
|
|
291
|
-
expect(typedCall).toHaveBeenCalledTimes(2);
|
|
292
|
-
expect(typedCall).toHaveBeenLastCalledWith('PortfolioUpdate', 'Success', {});
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
typedCall.mockReset();
|
|
297
|
-
typedCall
|
|
298
|
-
.mockResolvedValueOnce({ message: { processed_byte: 3 } })
|
|
299
|
-
.mockRejectedValueOnce(
|
|
300
|
-
ERRORS.TypedError(
|
|
301
|
-
HardwareErrorCode.RuntimeError,
|
|
302
|
-
'Failure_DataError,Invalid portfolio package'
|
|
303
|
-
)
|
|
304
|
-
);
|
|
305
|
-
await expect(upload()).resolves.toMatchObject({
|
|
306
|
-
success: false,
|
|
307
|
-
payload: {
|
|
308
|
-
code: HardwareErrorCode.RuntimeError,
|
|
309
|
-
error: 'Failure_DataError,Invalid portfolio package',
|
|
310
|
-
},
|
|
311
|
-
});
|
|
312
|
-
} finally {
|
|
313
|
-
await core.dispose();
|
|
314
|
-
DevicePool.resetState();
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
);
|
|
318
|
-
});
|
|
@@ -160,9 +160,20 @@ describe('DeviceStateMapper', () => {
|
|
|
160
160
|
expect(patch.status?.unlocked).toBeNull();
|
|
161
161
|
});
|
|
162
162
|
|
|
163
|
-
test.each([
|
|
164
|
-
|
|
165
|
-
|
|
163
|
+
test.each([
|
|
164
|
+
{ mode: 'normal', applicationData: undefined },
|
|
165
|
+
{
|
|
166
|
+
mode: 'normal',
|
|
167
|
+
applicationData: { version: '1.0.2', build_id: 'old-p2', hash: [0x01, 0x02] },
|
|
168
|
+
},
|
|
169
|
+
{ mode: 'notInitialized', applicationData: undefined },
|
|
170
|
+
{
|
|
171
|
+
mode: 'notInitialized',
|
|
172
|
+
applicationData: { version: '1.0.2', build_id: 'old-p2', hash: [0x01, 0x02] },
|
|
173
|
+
},
|
|
174
|
+
] as const)(
|
|
175
|
+
'clears cached loader P2 version and verification in $mode application mode',
|
|
176
|
+
({ mode, applicationData }) => {
|
|
166
177
|
const patch = mapProtocolV2DeviceInfoToState(
|
|
167
178
|
{
|
|
168
179
|
main_mcu: {
|
|
@@ -170,7 +181,7 @@ describe('DeviceStateMapper', () => {
|
|
|
170
181
|
application_data: applicationData,
|
|
171
182
|
},
|
|
172
183
|
} as ProtocolV2DeviceInfo,
|
|
173
|
-
|
|
184
|
+
mode
|
|
174
185
|
);
|
|
175
186
|
|
|
176
187
|
expect(patch.versions).toMatchObject({
|
|
@@ -868,6 +868,13 @@ describe('FirmwareUpdateV4 install polling', () => {
|
|
|
868
868
|
p1UpdatedAt: 0,
|
|
869
869
|
loaderBeforeUpdate: false,
|
|
870
870
|
},
|
|
871
|
+
{
|
|
872
|
+
scenario: 'uninitialized firmware P1 updated while P2 is unobservable',
|
|
873
|
+
updatedAt: Infinity,
|
|
874
|
+
p1UpdatedAt: 0,
|
|
875
|
+
loaderBeforeUpdate: false,
|
|
876
|
+
applicationMode: 'notInitialized',
|
|
877
|
+
},
|
|
871
878
|
{
|
|
872
879
|
scenario: 'P2-only install cannot be inferred from an already updated P1',
|
|
873
880
|
updatedAt: Infinity,
|
|
@@ -893,6 +900,7 @@ describe('FirmwareUpdateV4 install polling', () => {
|
|
|
893
900
|
skipReconnect,
|
|
894
901
|
statusUnavailable,
|
|
895
902
|
differentDevice,
|
|
903
|
+
applicationMode,
|
|
896
904
|
}) => {
|
|
897
905
|
let now = 0;
|
|
898
906
|
jest.spyOn(Date, 'now').mockImplementation(() => now);
|
|
@@ -951,7 +959,7 @@ describe('FirmwareUpdateV4 install polling', () => {
|
|
|
951
959
|
const normal =
|
|
952
960
|
options?.forceRuntimeContextRefresh && (!loaderBeforeUpdate || now >= updatedAt);
|
|
953
961
|
finalFeatures = {
|
|
954
|
-
mode: normal ? 'normal' : 'bootloader',
|
|
962
|
+
mode: normal ? applicationMode ?? 'normal' : 'bootloader',
|
|
955
963
|
bootloaderMode: !normal,
|
|
956
964
|
firmwareVersion: info.main_mcu?.application?.version,
|
|
957
965
|
} as Features;
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import FirmwareUpdateV4 from '../../src/api/FirmwareUpdateV4';
|
|
2
|
+
|
|
3
|
+
import type { ProtocolV2DeviceInfo } from '@onekeyfe/hd-transport';
|
|
4
|
+
import type { Device } from '../../src/device/Device';
|
|
5
|
+
import type { Features } from '../../src/types';
|
|
6
|
+
import type { FirmwareUpdateV4Params } from '../../src/types/api/firmwareUpdate';
|
|
7
|
+
|
|
8
|
+
jest.mock('../../src/data/config', () => ({
|
|
9
|
+
DEFAULT_DOMAIN: 'https://example.com/',
|
|
10
|
+
getSDKVersion: () => '0.0.0-test',
|
|
11
|
+
}));
|
|
12
|
+
|
|
13
|
+
type InstallTarget = { target_id: number; path: string };
|
|
14
|
+
type PollingMethod = {
|
|
15
|
+
params: FirmwareUpdateV4Params;
|
|
16
|
+
isBleReconnect: () => boolean;
|
|
17
|
+
protocolV2InstallNeedsReconnect: boolean;
|
|
18
|
+
protocolV2ExpectedSerialNumber: string;
|
|
19
|
+
protocolV2InstallBaselineVersions: Map<number, string>;
|
|
20
|
+
protocolV2LatestFinalFeatures?: Features;
|
|
21
|
+
protocolV2LatestFinalDeviceInfo?: ProtocolV2DeviceInfo;
|
|
22
|
+
reconnectProtocolV2Device: () => Promise<void>;
|
|
23
|
+
waitForProtocolV2FirmwareUpdateComplete: (
|
|
24
|
+
targets: InstallTarget[],
|
|
25
|
+
requireCurrentInstallStatus: boolean
|
|
26
|
+
) => Promise<void>;
|
|
27
|
+
assertExpectedProtocolV2Versions: () => void;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
type Scenario = {
|
|
31
|
+
scenario: string;
|
|
32
|
+
expectedTargetVersions?: FirmwareUpdateV4Params['expectedTargetVersions'];
|
|
33
|
+
currentVersion?: string;
|
|
34
|
+
p2Only?: boolean;
|
|
35
|
+
missingBaseline?: boolean;
|
|
36
|
+
loaderMode?: boolean;
|
|
37
|
+
completes: boolean;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const scenarios: Scenario[] = [
|
|
41
|
+
{ scenario: 'omitted expected versions', completes: true },
|
|
42
|
+
{ scenario: 'empty expected versions', expectedTargetVersions: {}, completes: true },
|
|
43
|
+
{
|
|
44
|
+
scenario: 'only a P1 expected version',
|
|
45
|
+
expectedTargetVersions: { app_v1: '1.0.3' },
|
|
46
|
+
completes: true,
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
scenario: 'matching paired expected versions',
|
|
50
|
+
expectedTargetVersions: { app_v1: '1.0.3', app_v2: '1.0.3' },
|
|
51
|
+
completes: true,
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
scenario: 'a mismatched expected P2 version',
|
|
55
|
+
expectedTargetVersions: { app_v2: '1.0.4' },
|
|
56
|
+
completes: false,
|
|
57
|
+
},
|
|
58
|
+
{ scenario: 'unchanged P1', currentVersion: '1.0.2', completes: false },
|
|
59
|
+
{ scenario: 'P2-only without expected versions', p2Only: true, completes: false },
|
|
60
|
+
{ scenario: 'a missing P1 baseline', missingBaseline: true, completes: false },
|
|
61
|
+
{ scenario: 'a device still in loader mode', loaderMode: true, completes: false },
|
|
62
|
+
];
|
|
63
|
+
|
|
64
|
+
describe.each([
|
|
65
|
+
{ transport: 'USB', isBle: false, platform: 'desktop' as const },
|
|
66
|
+
{ transport: 'BLE', isBle: true, platform: 'native' as const },
|
|
67
|
+
])('FirmwareUpdateV4 direct binaries over $transport', ({ isBle, platform }) => {
|
|
68
|
+
afterEach(() => {
|
|
69
|
+
jest.restoreAllMocks();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
describe.each([
|
|
73
|
+
{ endpoint: 'empty records', unavailable: false },
|
|
74
|
+
{ endpoint: 'unavailable status handler', unavailable: true },
|
|
75
|
+
])('$endpoint without observed install evidence', ({ unavailable }) => {
|
|
76
|
+
test.each(scenarios)('$scenario', async scenario => {
|
|
77
|
+
let now = 0;
|
|
78
|
+
jest.spyOn(Date, 'now').mockImplementation(() => now);
|
|
79
|
+
jest.spyOn(global, 'setTimeout').mockImplementation(((
|
|
80
|
+
callback: () => void,
|
|
81
|
+
delay: number
|
|
82
|
+
) => {
|
|
83
|
+
now += delay;
|
|
84
|
+
callback();
|
|
85
|
+
return 0;
|
|
86
|
+
}) as typeof setTimeout);
|
|
87
|
+
|
|
88
|
+
const method = new FirmwareUpdateV4({
|
|
89
|
+
id: 1,
|
|
90
|
+
payload: {
|
|
91
|
+
method: 'firmwareUpdateV4',
|
|
92
|
+
connectId: 'pro2-optional-version-test',
|
|
93
|
+
platform,
|
|
94
|
+
...(!scenario.p2Only ? { applicationP1Binary: new ArrayBuffer(1) } : {}),
|
|
95
|
+
applicationP2Binary: new ArrayBuffer(1),
|
|
96
|
+
...(scenario.expectedTargetVersions !== undefined
|
|
97
|
+
? { expectedTargetVersions: scenario.expectedTargetVersions }
|
|
98
|
+
: {}),
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
method.init();
|
|
102
|
+
|
|
103
|
+
const firmwareVersion = scenario.currentVersion ?? '1.0.3';
|
|
104
|
+
const deviceInfo = {
|
|
105
|
+
hw: { serial_no: 'pro2-optional-version-test' },
|
|
106
|
+
main_mcu: { application: { version: firmwareVersion } },
|
|
107
|
+
} as ProtocolV2DeviceInfo;
|
|
108
|
+
const features = {
|
|
109
|
+
mode: scenario.loaderMode ? 'bootloader' : 'normal',
|
|
110
|
+
bootloaderMode: !!scenario.loaderMode,
|
|
111
|
+
firmwareVersion,
|
|
112
|
+
} as Features;
|
|
113
|
+
const typedCall = jest.fn().mockImplementation((type: string) => {
|
|
114
|
+
if (type === 'DeviceInfoGet') return { type: 'DeviceInfo', message: deviceInfo };
|
|
115
|
+
if (type === 'DeviceFirmwareUpdateStatusGet') {
|
|
116
|
+
if (unavailable) throw new Error('unsupported message');
|
|
117
|
+
return { type: 'DeviceFirmwareUpdateStatus', message: { records: [] } };
|
|
118
|
+
}
|
|
119
|
+
throw new Error(`Unexpected command: ${type}`);
|
|
120
|
+
});
|
|
121
|
+
const probeProtocolV2RuntimeState = jest.fn().mockResolvedValue(features);
|
|
122
|
+
method.device = {
|
|
123
|
+
originalDescriptor: { path: 'pro2-optional-version-test' },
|
|
124
|
+
getCommands: () => ({ typedCall }),
|
|
125
|
+
probeProtocolV2RuntimeState,
|
|
126
|
+
setCancelableAction: jest.fn(),
|
|
127
|
+
} as unknown as Device;
|
|
128
|
+
method.postProgressMessage = jest.fn();
|
|
129
|
+
|
|
130
|
+
const pollingMethod = method as unknown as PollingMethod;
|
|
131
|
+
expect(pollingMethod.params.expectedTargetVersions).toEqual(scenario.expectedTargetVersions);
|
|
132
|
+
pollingMethod.isBleReconnect = () => isBle;
|
|
133
|
+
pollingMethod.protocolV2InstallNeedsReconnect = true;
|
|
134
|
+
pollingMethod.protocolV2ExpectedSerialNumber = 'pro2-optional-version-test';
|
|
135
|
+
pollingMethod.protocolV2InstallBaselineVersions = new Map([
|
|
136
|
+
[4, '1.0.2'],
|
|
137
|
+
[5, '1.0.2'],
|
|
138
|
+
]);
|
|
139
|
+
if (scenario.missingBaseline) pollingMethod.protocolV2InstallBaselineVersions.delete(4);
|
|
140
|
+
pollingMethod.reconnectProtocolV2Device = jest.fn().mockResolvedValue(undefined);
|
|
141
|
+
const targets = [
|
|
142
|
+
{ target_id: 4, path: 'vol0:/application_p1.bin' },
|
|
143
|
+
{ target_id: 5, path: 'vol0:/application_p2.bin' },
|
|
144
|
+
].filter(target => !scenario.p2Only || target.target_id === 5);
|
|
145
|
+
|
|
146
|
+
const polling = pollingMethod.waitForProtocolV2FirmwareUpdateComplete(targets, true);
|
|
147
|
+
if (scenario.completes) {
|
|
148
|
+
await expect(polling).resolves.toBeUndefined();
|
|
149
|
+
expect(now).toBe(0);
|
|
150
|
+
expect(method.postProgressMessage).toHaveBeenCalledWith(100, 'installingFirmware');
|
|
151
|
+
pollingMethod.protocolV2LatestFinalFeatures = features;
|
|
152
|
+
pollingMethod.protocolV2LatestFinalDeviceInfo = deviceInfo;
|
|
153
|
+
expect(() => pollingMethod.assertExpectedProtocolV2Versions()).not.toThrow();
|
|
154
|
+
} else {
|
|
155
|
+
await expect(polling).rejects.toMatchObject({
|
|
156
|
+
params: { firmwareUpdateCode: 'FirmwareInstallTimeout' },
|
|
157
|
+
});
|
|
158
|
+
expect(now).toBe(600_000);
|
|
159
|
+
expect(method.postProgressMessage).not.toHaveBeenCalledWith(100, 'installingFirmware');
|
|
160
|
+
}
|
|
161
|
+
expect(probeProtocolV2RuntimeState).toHaveBeenLastCalledWith(deviceInfo, expect.any(Number), {
|
|
162
|
+
forceRuntimeContextRefresh: true,
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirmwareUpdateV4.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV4.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAMZ,MAAM,qBAAqB,CAAC;AA0B7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAiC/E,OAAO,KAAK,EAEV,sBAAsB,EAEvB,MAAM,6BAA6B,CAAC;AAuErC,wBAAgB,wCAAwC,CACtD,UAAU,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,EAC5C,MAAM,EAAE,sBAAsB,EAC9B,0BAA0B,UAAQ,QAiCnC;AA8UD,eAAO,MAAM,oCAAoC,WACvC,WAAW,GAAG,UAAU,eACnB,MAAM,GAAG,SAAS,YAKhC,CAAC;AAEF,eAAO,MAAM,iCAAiC,0BACrB,MAAM,uBACR,MAAM,iBACZ,MAAM,eACR,MAAM,SAsBpB,CAAC;AAUF,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,wBAAwB,CAAC,sBAAsB,CAAC;IAC5F,OAAO,CAAC,8BAA8B,CAAC,CAAS;IAEhD,OAAO,CAAC,sBAAsB,CAAC,CAAS;IAExC,OAAO,CAAC,oCAAoC,CAAS;IAErD,qBAAqB;IAIrB,OAAO,CAAC,yBAAyB,CAA4B;IAE7D,OAAO,CAAC,2BAA2B,CAAS;IAE5C,OAAO,CAAC,iCAAiC,CAAS;IAElD,OAAO,CAAC,iCAAiC,CAA6B;IAEtE,OAAO,CAAC,4BAA4B,CAAqB;IAEzD,OAAO,CAAC,6BAA6B,CAAC,CAAW;IAEjD,OAAO,CAAC,+BAA+B,CAAC,CAAuB;IAE/D,OAAO,CAAC,2BAA2B,CAAC,CAAuB;IAE3D,OAAO,CAAC,iCAAiC,CAA6B;IAEtE,OAAO,CAAC,+BAA+B,CAAS;IAEhD,OAAO,CAAC,mCAAmC,CAAS;IAEpD,OAAO,CAAC,wCAAwC,CAAS;IAEzD,OAAO,CAAC,kCAAkC,CAAC,CAAW;IAEtD,OAAO,CAAC,8BAA8B,CAAC,CAAS;IAEhD,OAAO,CAAC,gCAAgC,CAAK;IAE7C,OAAO,CAAC,8BAA8B,CAAK;IAE3C,IAAI;IA6LJ,OAAO,CAAC,8BAA8B;IAwBhC,GAAG;;;;;YAKK,aAAa;YA4Ib,4BAA4B;YAkB5B,0BAA0B;YAY1B,8BAA8B;YAK9B,+BAA+B;YAqG/B,4BAA4B;YA+C5B,0CAA0C;YAkB1C,qCAAqC;YAoFrC,gCAAgC;YAgBhC,uCAAuC;YAmDvC,8BAA8B;IA8B5C,OAAO,CAAC,8BAA8B;IA0BtC,OAAO,CAAC,kCAAkC;IAc1C,OAAO,CAAC,gCAAgC;YA2D1B,2BAA2B;IAmBzC,OAAO,CAAC,yBAAyB;IAKjC,OAAO,CAAC,oCAAoC;IAY5C,OAAO,CAAC,4BAA4B;IAUpC,OAAO,CAAC,kCAAkC;IAS1C,OAAO,CAAC,8BAA8B;YAMxB,iCAAiC;YAOjC,iCAAiC;YAoBjC,iCAAiC;IAU/C,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,mCAAmC;IAe3C,OAAO,CAAC,iCAAiC;IAWzC,OAAO,CAAC,2BAA2B;IAsBnC,OAAO,CAAC,yBAAyB;IAiBjC,OAAO,CAAC,wBAAwB;YAkBlB,iCAAiC;YA6CjC,uCAAuC;YA0CvC,+BAA+B;IAmF7C,OAAO,CAAC,6BAA6B;IAMrC,OAAO,CAAC,gCAAgC;YAM1B,8BAA8B;YAmD9B,kCAAkC;IAkChD,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,yBAAyB;YAcnB,4BAA4B;IAkBpC,6BAA6B;YAkBrB,+BAA+B;IAkD7C,OAAO,CAAC,6BAA6B;YAkCvB,6BAA6B;YA0B7B,0CAA0C;YA6B1C,uBAAuB;YAiCvB,8BAA8B;YAkF9B,6BAA6B;IA0F3C,OAAO,CAAC,mCAAmC;YAI7B,0BAA0B;IAaxC,OAAO,CAAC,8BAA8B;IAiBtC,OAAO,CAAC,4BAA4B;IAoLpC,OAAO,CAAC,6BAA6B;IAcrC,OAAO,CAAC,qCAAqC;
|
|
1
|
+
{"version":3,"file":"FirmwareUpdateV4.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV4.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,11 +5,6 @@ export type UploadPortfolioParams = {
|
|
|
5
5
|
uiMode?: 'silent' | 'progress';
|
|
6
6
|
};
|
|
7
7
|
export default class UploadPortfolio extends FileWrite {
|
|
8
|
-
getVersionRange(): {
|
|
9
|
-
model_pro2: {
|
|
10
|
-
min: string;
|
|
11
|
-
};
|
|
12
|
-
};
|
|
13
8
|
init(): void;
|
|
14
9
|
run(): Promise<{
|
|
15
10
|
portfolioUpdated: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UploadPortfolio.d.ts","sourceRoot":"","sources":["../../src/api/UploadPortfolio.ts"],"names":[],"mappings":"AAIA,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,MAAM,MAAM,qBAAqB,GAAG;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAE5B,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;CAChC,CAAC;AAQF,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,SAAS;IACpD,
|
|
1
|
+
{"version":3,"file":"UploadPortfolio.d.ts","sourceRoot":"","sources":["../../src/api/UploadPortfolio.ts"],"names":[],"mappings":"AAIA,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,MAAM,MAAM,qBAAqB,GAAG;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAE5B,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;CAChC,CAAC;AAQF,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,SAAS;IACpD,IAAI;IAuBE,GAAG;;;;;;;;CAsBV"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeviceStateMapper.d.ts","sourceRoot":"","sources":["../../src/device/DeviceStateMapper.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,aAAa,EAEb,cAAc,EACd,YAAY,EACZ,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAEV,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACR,cAAc,EACf,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAsDxE,eAAO,MAAM,kBAAkB,aAAc,QAAQ,KAAG,gBAqEtD,CAAC;AAEH,eAAO,MAAM,4BAA4B,uBACnB,cAAc,KACjC,gBAA0F,CAAC;AAc9F,eAAO,MAAM,kCAAkC,aAAc,cAAc,KAAG,gBAgE7E,CAAC;AAEF,eAAO,MAAM,8BAA8B,SACnC,oBAAoB,SACpB,eAAe,KACpB,
|
|
1
|
+
{"version":3,"file":"DeviceStateMapper.d.ts","sourceRoot":"","sources":["../../src/device/DeviceStateMapper.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,aAAa,EAEb,cAAc,EACd,YAAY,EACZ,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAEV,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACR,cAAc,EACf,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAsDxE,eAAO,MAAM,kBAAkB,aAAc,QAAQ,KAAG,gBAqEtD,CAAC;AAEH,eAAO,MAAM,4BAA4B,uBACnB,cAAc,KACjC,gBAA0F,CAAC;AAc9F,eAAO,MAAM,kCAAkC,aAAc,cAAc,KAAG,gBAgE7E,CAAC;AAEF,eAAO,MAAM,8BAA8B,SACnC,oBAAoB,SACpB,eAAe,KACpB,gBAiHF,CAAC;AAEF,eAAO,MAAM,gCAAgC,WAAY,YAAY,KAAG,gBActE,CAAC;AAEH,eAAO,MAAM,uBAAuB,aAAc,aAAa,KAAG,gBAmBjE,CAAC;AAEF,eAAO,MAAM,wBAAwB,aAAc,cAAc,KAAG,gBA0BnE,CAAC;AAEF,eAAO,MAAM,6BAA6B,aAAc,oBAAoB,KAAG,cAe3E,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -44899,7 +44899,9 @@ const mapProtocolV2DeviceInfoToState = (info, mode = 'unknown') => {
|
|
|
44899
44899
|
versions: definedEntries({
|
|
44900
44900
|
firmware: imageVersion((_d = info.main_mcu) === null || _d === void 0 ? void 0 : _d.application),
|
|
44901
44901
|
applicationP1: imageVersion((_e = info.main_mcu) === null || _e === void 0 ? void 0 : _e.application),
|
|
44902
|
-
applicationP2: mode === 'normal'
|
|
44902
|
+
applicationP2: mode === 'normal' || mode === 'notInitialized'
|
|
44903
|
+
? null
|
|
44904
|
+
: imageVersion((_f = info.main_mcu) === null || _f === void 0 ? void 0 : _f.application_data),
|
|
44903
44905
|
bootloader: imageVersion((_g = info.main_mcu) === null || _g === void 0 ? void 0 : _g.bootloader),
|
|
44904
44906
|
board: imageVersion((_h = info.main_mcu) === null || _h === void 0 ? void 0 : _h.romloader),
|
|
44905
44907
|
ble: imageVersion((_j = info.coprocessor) === null || _j === void 0 ? void 0 : _j.application),
|
|
@@ -44917,8 +44919,12 @@ const mapProtocolV2DeviceInfoToState = (info, mode = 'unknown') => {
|
|
|
44917
44919
|
firmwareHash: imageHash((_u = info.main_mcu) === null || _u === void 0 ? void 0 : _u.application),
|
|
44918
44920
|
applicationP1BuildId: imageBuildId((_v = info.main_mcu) === null || _v === void 0 ? void 0 : _v.application),
|
|
44919
44921
|
applicationP1Hash: imageHash((_w = info.main_mcu) === null || _w === void 0 ? void 0 : _w.application),
|
|
44920
|
-
applicationP2BuildId: mode === 'normal'
|
|
44921
|
-
|
|
44922
|
+
applicationP2BuildId: mode === 'normal' || mode === 'notInitialized'
|
|
44923
|
+
? null
|
|
44924
|
+
: imageBuildId((_x = info.main_mcu) === null || _x === void 0 ? void 0 : _x.application_data),
|
|
44925
|
+
applicationP2Hash: mode === 'normal' || mode === 'notInitialized'
|
|
44926
|
+
? null
|
|
44927
|
+
: imageHash((_y = info.main_mcu) === null || _y === void 0 ? void 0 : _y.application_data),
|
|
44922
44928
|
bootloaderBuildId: imageBuildId((_z = info.main_mcu) === null || _z === void 0 ? void 0 : _z.bootloader),
|
|
44923
44929
|
bootloaderHash: imageHash((_0 = info.main_mcu) === null || _0 === void 0 ? void 0 : _0.bootloader),
|
|
44924
44930
|
boardBuildId: imageBuildId((_1 = info.main_mcu) === null || _1 === void 0 ? void 0 : _1.romloader),
|
|
@@ -53297,7 +53303,7 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
|
|
|
53297
53303
|
app_v1: features
|
|
53298
53304
|
? getDeviceFirmwareVersion(features).join('.')
|
|
53299
53305
|
: (_c = (_b = deviceInfo === null || deviceInfo === void 0 ? void 0 : deviceInfo.main_mcu) === null || _b === void 0 ? void 0 : _b.application) === null || _c === void 0 ? void 0 : _c.version,
|
|
53300
|
-
app_v2:
|
|
53306
|
+
app_v2: features && this.isProtocolV2ApplicationMode(features)
|
|
53301
53307
|
? getDeviceFirmwareVersion(features).join('.')
|
|
53302
53308
|
: (_e = (_d = deviceInfo === null || deviceInfo === void 0 ? void 0 : deviceInfo.main_mcu) === null || _d === void 0 ? void 0 : _d.application_data) === null || _e === void 0 ? void 0 : _e.version,
|
|
53303
53309
|
coprocessor: features ? getDeviceBLEFirmwareVersion(features).join('.') : undefined,
|
|
@@ -54171,7 +54177,7 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
|
|
|
54171
54177
|
versions.set(ProtocolV2FirmwareTargetType.FW_MGMT_TARGET_BOOTLOADER, getDeviceBootloaderVersion(features).join('.'));
|
|
54172
54178
|
const applicationVersion = getDeviceFirmwareVersion(features).join('.');
|
|
54173
54179
|
versions.set(ProtocolV2FirmwareTargetType.FW_MGMT_TARGET_APPLICATION_P1, applicationVersion);
|
|
54174
|
-
const applicationP2Version = features
|
|
54180
|
+
const applicationP2Version = this.isProtocolV2ApplicationMode(features)
|
|
54175
54181
|
? applicationVersion
|
|
54176
54182
|
: (_b = (_a = deviceInfo === null || deviceInfo === void 0 ? void 0 : deviceInfo.main_mcu) === null || _a === void 0 ? void 0 : _a.application_data) === null || _b === void 0 ? void 0 : _b.version;
|
|
54177
54183
|
if (applicationP2Version) {
|
|
@@ -54198,8 +54204,9 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
|
|
|
54198
54204
|
const p2TargetId = ProtocolV2FirmwareTargetType.FW_MGMT_TARGET_APPLICATION_P2;
|
|
54199
54205
|
return (expectedTargetIds.size > 0 &&
|
|
54200
54206
|
Array.from(expectedTargetIds).every(targetId => {
|
|
54201
|
-
var _a, _b, _c;
|
|
54202
|
-
if (targetId === p2TargetId &&
|
|
54207
|
+
var _a, _b, _c, _d;
|
|
54208
|
+
if (targetId === p2TargetId &&
|
|
54209
|
+
this.isProtocolV2ApplicationMode(this.protocolV2LastRuntimeProbeFeatures)) {
|
|
54203
54210
|
if (!expectedTargetIds.has(p1TargetId))
|
|
54204
54211
|
return false;
|
|
54205
54212
|
const previousP1Version = this.protocolV2InstallBaselineVersions.get(p1TargetId);
|
|
@@ -54207,7 +54214,8 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
|
|
|
54207
54214
|
return (previousP1Version !== undefined &&
|
|
54208
54215
|
currentP1Version !== undefined &&
|
|
54209
54216
|
previousP1Version !== currentP1Version &&
|
|
54210
|
-
|
|
54217
|
+
(((_b = (_a = this.params) === null || _a === void 0 ? void 0 : _a.expectedTargetVersions) === null || _b === void 0 ? void 0 : _b.app_v2) === undefined ||
|
|
54218
|
+
currentP1Version === ((_d = (_c = this.params) === null || _c === void 0 ? void 0 : _c.expectedTargetVersions) === null || _d === void 0 ? void 0 : _d.app_v2)));
|
|
54211
54219
|
}
|
|
54212
54220
|
const previousVersion = this.protocolV2InstallBaselineVersions.get(targetId);
|
|
54213
54221
|
const currentVersion = currentVersions.get(targetId);
|
|
@@ -55547,9 +55555,6 @@ const PORTFOLIO_PACKAGE_MAX_BYTES = 128 * 1024;
|
|
|
55547
55555
|
const FILESYSTEM_FILE_WRITE_MESSAGE_TYPE = 60805;
|
|
55548
55556
|
const PORTFOLIO_UPDATE_MESSAGE_TYPE = 61400;
|
|
55549
55557
|
class UploadPortfolio extends FileWrite {
|
|
55550
|
-
getVersionRange() {
|
|
55551
|
-
return { model_pro2: { min: '1.0.3' } };
|
|
55552
|
-
}
|
|
55553
55558
|
init() {
|
|
55554
55559
|
const { packageBase64, timeoutMs, uiMode = 'silent' } = this.payload;
|
|
55555
55560
|
const packageBytes = decodeCanonicalBase64({
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onekeyfe/hd-core",
|
|
3
|
-
"version": "1.2.6
|
|
3
|
+
"version": "1.2.6",
|
|
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.2.6
|
|
29
|
-
"@onekeyfe/hd-transport": "1.2.6
|
|
28
|
+
"@onekeyfe/hd-shared": "1.2.6",
|
|
29
|
+
"@onekeyfe/hd-transport": "1.2.6",
|
|
30
30
|
"axios": "1.15.2",
|
|
31
31
|
"bignumber.js": "^9.0.2",
|
|
32
32
|
"buffer": "^6.0.3",
|
|
@@ -46,5 +46,5 @@
|
|
|
46
46
|
"@types/w3c-web-usb": "^1.0.10",
|
|
47
47
|
"@types/web-bluetooth": "^0.0.21"
|
|
48
48
|
},
|
|
49
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "84345adb00215008eb8b29b2595a41368145ed95"
|
|
50
50
|
}
|
|
@@ -1390,7 +1390,7 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
1390
1390
|
: deviceInfo?.main_mcu?.application?.version,
|
|
1391
1391
|
// Production boot verifies P2 against P1 before normal firmware can run.
|
|
1392
1392
|
app_v2:
|
|
1393
|
-
features
|
|
1393
|
+
features && this.isProtocolV2ApplicationMode(features)
|
|
1394
1394
|
? getDeviceFirmwareVersion(features).join('.')
|
|
1395
1395
|
: deviceInfo?.main_mcu?.application_data?.version,
|
|
1396
1396
|
coprocessor: features ? getDeviceBLEFirmwareVersion(features).join('.') : undefined,
|
|
@@ -2531,10 +2531,9 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
2531
2531
|
);
|
|
2532
2532
|
const applicationVersion = getDeviceFirmwareVersion(features).join('.');
|
|
2533
2533
|
versions.set(ProtocolV2FirmwareTargetType.FW_MGMT_TARGET_APPLICATION_P1, applicationVersion);
|
|
2534
|
-
const applicationP2Version =
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
: deviceInfo?.main_mcu?.application_data?.version;
|
|
2534
|
+
const applicationP2Version = this.isProtocolV2ApplicationMode(features)
|
|
2535
|
+
? applicationVersion
|
|
2536
|
+
: deviceInfo?.main_mcu?.application_data?.version;
|
|
2538
2537
|
if (applicationP2Version) {
|
|
2539
2538
|
versions.set(
|
|
2540
2539
|
ProtocolV2FirmwareTargetType.FW_MGMT_TARGET_APPLICATION_P2,
|
|
@@ -2571,7 +2570,10 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
2571
2570
|
return (
|
|
2572
2571
|
expectedTargetIds.size > 0 &&
|
|
2573
2572
|
Array.from(expectedTargetIds).every(targetId => {
|
|
2574
|
-
if (
|
|
2573
|
+
if (
|
|
2574
|
+
targetId === p2TargetId &&
|
|
2575
|
+
this.isProtocolV2ApplicationMode(this.protocolV2LastRuntimeProbeFeatures)
|
|
2576
|
+
) {
|
|
2575
2577
|
// P1 must change in this install; a pre-existing P1 version cannot prove a P2-only update.
|
|
2576
2578
|
if (!expectedTargetIds.has(p1TargetId)) return false;
|
|
2577
2579
|
const previousP1Version = this.protocolV2InstallBaselineVersions.get(p1TargetId);
|
|
@@ -2580,7 +2582,8 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
2580
2582
|
previousP1Version !== undefined &&
|
|
2581
2583
|
currentP1Version !== undefined &&
|
|
2582
2584
|
previousP1Version !== currentP1Version &&
|
|
2583
|
-
|
|
2585
|
+
(this.params?.expectedTargetVersions?.app_v2 === undefined ||
|
|
2586
|
+
currentP1Version === this.params?.expectedTargetVersions?.app_v2)
|
|
2584
2587
|
);
|
|
2585
2588
|
}
|
|
2586
2589
|
const previousVersion = this.protocolV2InstallBaselineVersions.get(targetId);
|
|
@@ -18,11 +18,6 @@ const FILESYSTEM_FILE_WRITE_MESSAGE_TYPE = 60805;
|
|
|
18
18
|
const PORTFOLIO_UPDATE_MESSAGE_TYPE = 61400;
|
|
19
19
|
|
|
20
20
|
export default class UploadPortfolio extends FileWrite {
|
|
21
|
-
getVersionRange() {
|
|
22
|
-
// Pro2 and Neo rotated the Portfolio verification key in firmware 1.0.3.
|
|
23
|
-
return { model_pro2: { min: '1.0.3' } };
|
|
24
|
-
}
|
|
25
|
-
|
|
26
21
|
init() {
|
|
27
22
|
const { packageBase64, timeoutMs, uiMode = 'silent' } = this.payload as UploadPortfolioParams;
|
|
28
23
|
const packageBytes = decodeCanonicalBase64({
|
|
@@ -272,7 +272,10 @@ export const mapProtocolV2DeviceInfoToState = (
|
|
|
272
272
|
firmware: imageVersion(info.main_mcu?.application),
|
|
273
273
|
applicationP1: imageVersion(info.main_mcu?.application),
|
|
274
274
|
// The running application does not report P2; discard a loader-era version.
|
|
275
|
-
applicationP2:
|
|
275
|
+
applicationP2:
|
|
276
|
+
mode === 'normal' || mode === 'notInitialized'
|
|
277
|
+
? null
|
|
278
|
+
: imageVersion(info.main_mcu?.application_data),
|
|
276
279
|
bootloader: imageVersion(info.main_mcu?.bootloader),
|
|
277
280
|
board: imageVersion(info.main_mcu?.romloader),
|
|
278
281
|
ble: imageVersion(info.coprocessor?.application),
|
|
@@ -291,8 +294,13 @@ export const mapProtocolV2DeviceInfoToState = (
|
|
|
291
294
|
applicationP1BuildId: imageBuildId(info.main_mcu?.application),
|
|
292
295
|
applicationP1Hash: imageHash(info.main_mcu?.application),
|
|
293
296
|
applicationP2BuildId:
|
|
294
|
-
mode === 'normal'
|
|
295
|
-
|
|
297
|
+
mode === 'normal' || mode === 'notInitialized'
|
|
298
|
+
? null
|
|
299
|
+
: imageBuildId(info.main_mcu?.application_data),
|
|
300
|
+
applicationP2Hash:
|
|
301
|
+
mode === 'normal' || mode === 'notInitialized'
|
|
302
|
+
? null
|
|
303
|
+
: imageHash(info.main_mcu?.application_data),
|
|
296
304
|
bootloaderBuildId: imageBuildId(info.main_mcu?.bootloader),
|
|
297
305
|
bootloaderHash: imageHash(info.main_mcu?.bootloader),
|
|
298
306
|
boardBuildId: imageBuildId(info.main_mcu?.romloader),
|