@onekeyfe/hd-core 1.2.0-alpha.65 → 1.2.0-alpha.67
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__/firmware-update/device-update-bootloader.test.ts +87 -0
- package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +18 -0
- package/__tests__/protocol-v2.test.ts +104 -0
- package/dist/api/FirmwareUpdateV2.d.ts +0 -1
- package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +25 -29
- package/dist/types/api/firmwareUpdate.d.ts +0 -1
- package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/api/FirmwareUpdateV2.ts +14 -32
- package/src/api/FirmwareUpdateV4.ts +13 -6
- package/src/api/device/DeviceUpdateBootloader.ts +1 -1
- package/src/types/api/firmwareUpdate.ts +0 -1
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { EDeviceType, EFirmwareType, ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
|
|
2
|
+
|
|
3
|
+
import DeviceUpdateBootloader from '../../src/api/device/DeviceUpdateBootloader';
|
|
4
|
+
import {
|
|
5
|
+
registerFirmwareUpdateHostBinding,
|
|
6
|
+
unregisterFirmwareUpdateHostBinding,
|
|
7
|
+
} from '../../src/api/firmware/FirmwareHostBinding';
|
|
8
|
+
|
|
9
|
+
jest.mock('../../src/api/firmware/FirmwareUpdatePreparedPlan', () => ({
|
|
10
|
+
assertFirmwareUpdatePreparedPlanBinding: jest.fn(),
|
|
11
|
+
assertFirmwareUpdatePreparedPlanDeviceIdentity: jest.fn(),
|
|
12
|
+
}));
|
|
13
|
+
|
|
14
|
+
jest.mock('../../src/data-manager', () => ({
|
|
15
|
+
DataManager: {
|
|
16
|
+
getSettings: jest.fn(),
|
|
17
|
+
isBleConnect: jest.fn(),
|
|
18
|
+
},
|
|
19
|
+
}));
|
|
20
|
+
|
|
21
|
+
jest.mock('../../src/device/DevicePool', () => ({
|
|
22
|
+
DevicePool: {},
|
|
23
|
+
}));
|
|
24
|
+
|
|
25
|
+
const artifact = {
|
|
26
|
+
artifactRef: `fw:${'a'.repeat(64)}`,
|
|
27
|
+
size: 4,
|
|
28
|
+
sha256: 'a'.repeat(64),
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const createMethod = () => {
|
|
32
|
+
const closeError = new Error('artifact reader close failed');
|
|
33
|
+
const close = jest.fn().mockRejectedValue(closeError);
|
|
34
|
+
const artifactReader = {
|
|
35
|
+
open: jest.fn().mockResolvedValue({ readerId: 'reader-1', size: artifact.size }),
|
|
36
|
+
read: jest.fn(),
|
|
37
|
+
close,
|
|
38
|
+
};
|
|
39
|
+
const hostBindingGeneration = registerFirmwareUpdateHostBinding({ artifactReader });
|
|
40
|
+
const method = new DeviceUpdateBootloader({
|
|
41
|
+
id: 1,
|
|
42
|
+
payload: {
|
|
43
|
+
method: 'deviceUpdateBootloader',
|
|
44
|
+
artifact,
|
|
45
|
+
hostBindingGeneration,
|
|
46
|
+
preparedPlan: {},
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
(method as any).device = {
|
|
50
|
+
features: {
|
|
51
|
+
deviceType: EDeviceType.Touch,
|
|
52
|
+
serialNo: 'touch-device-id',
|
|
53
|
+
},
|
|
54
|
+
getCurrentDeviceType: () => EDeviceType.Touch,
|
|
55
|
+
getCurrentFirmwareType: () => EFirmwareType.Universal,
|
|
56
|
+
};
|
|
57
|
+
return { close, closeError, method };
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
describe('DeviceUpdateBootloader artifact source cleanup', () => {
|
|
61
|
+
afterEach(() => {
|
|
62
|
+
unregisterFirmwareUpdateHostBinding();
|
|
63
|
+
jest.restoreAllMocks();
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('does not replace a successful update result when source close fails', async () => {
|
|
67
|
+
const { close, method } = createMethod();
|
|
68
|
+
jest.spyOn(method, 'updateTouchBootloader').mockResolvedValue(true);
|
|
69
|
+
|
|
70
|
+
await expect(method.run()).resolves.toBe(true);
|
|
71
|
+
|
|
72
|
+
expect(close).toHaveBeenCalledWith({ readerId: 'reader-1' });
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test('does not replace the original hardware error when source close fails', async () => {
|
|
76
|
+
const { close, method } = createMethod();
|
|
77
|
+
const hardwareError = ERRORS.TypedError(
|
|
78
|
+
HardwareErrorCode.FirmwareError,
|
|
79
|
+
'original bootloader hardware error'
|
|
80
|
+
);
|
|
81
|
+
jest.spyOn(method, 'updateTouchBootloader').mockRejectedValue(hardwareError);
|
|
82
|
+
|
|
83
|
+
await expect(method.run()).rejects.toBe(hardwareError);
|
|
84
|
+
|
|
85
|
+
expect(close).toHaveBeenCalledWith({ readerId: 'reader-1' });
|
|
86
|
+
});
|
|
87
|
+
});
|
|
@@ -108,6 +108,24 @@ describe('FirmwareUpdatePreparedPlan', () => {
|
|
|
108
108
|
],
|
|
109
109
|
})
|
|
110
110
|
).toEqual(prepared);
|
|
111
|
+
expect(() =>
|
|
112
|
+
assertFirmwareUpdatePreparedPlanBinding({
|
|
113
|
+
preparedPlan: prepared,
|
|
114
|
+
executor: 'v2',
|
|
115
|
+
platform: 'native',
|
|
116
|
+
scopeTargets: ['firmware', 'resource'],
|
|
117
|
+
bindings: [
|
|
118
|
+
{
|
|
119
|
+
target: 'firmware',
|
|
120
|
+
artifact: artifact('a'.repeat(64), 4),
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
target: 'resource',
|
|
124
|
+
artifact: artifact('b'.repeat(64), 8),
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
})
|
|
128
|
+
).toThrow('artifact binding is invalid');
|
|
111
129
|
expect(() =>
|
|
112
130
|
assertFirmwareUpdatePreparedPlanBinding({
|
|
113
131
|
preparedPlan: prepared,
|
|
@@ -4340,6 +4340,110 @@ describe('Protocol V2 firmware update targets', () => {
|
|
|
4340
4340
|
).toThrow('expected 131072');
|
|
4341
4341
|
});
|
|
4342
4342
|
|
|
4343
|
+
test('fails install polling immediately with the original firmware verification error', async () => {
|
|
4344
|
+
const method = new FirmwareUpdateV4({
|
|
4345
|
+
id: 1,
|
|
4346
|
+
payload: {
|
|
4347
|
+
method: 'firmwareUpdateV4',
|
|
4348
|
+
platform: 'desktop',
|
|
4349
|
+
expectedTargetVersions: {
|
|
4350
|
+
app_v1: '2.0.0',
|
|
4351
|
+
},
|
|
4352
|
+
},
|
|
4353
|
+
});
|
|
4354
|
+
method.init();
|
|
4355
|
+
const typedCall = jest.fn().mockResolvedValue({
|
|
4356
|
+
type: 'DeviceFirmwareUpdateStatus',
|
|
4357
|
+
message: {
|
|
4358
|
+
records: [{ target_id: 4, status: 2, payload_version: 0x010000 }],
|
|
4359
|
+
},
|
|
4360
|
+
});
|
|
4361
|
+
const dateNowSpy = jest
|
|
4362
|
+
.spyOn(Date, 'now')
|
|
4363
|
+
.mockReturnValueOnce(0)
|
|
4364
|
+
.mockReturnValueOnce(0)
|
|
4365
|
+
.mockReturnValue(300_001);
|
|
4366
|
+
const setTimeoutSpy = jest.spyOn(global, 'setTimeout').mockImplementation(((
|
|
4367
|
+
callback: () => void
|
|
4368
|
+
) => {
|
|
4369
|
+
callback();
|
|
4370
|
+
return 0 as any;
|
|
4371
|
+
}) as typeof setTimeout);
|
|
4372
|
+
|
|
4373
|
+
(method as any).device = stubDevice({
|
|
4374
|
+
getCommands: () => ({ typedCall }),
|
|
4375
|
+
});
|
|
4376
|
+
(method as any).reconnectProtocolV2Device = jest.fn().mockResolvedValue(undefined);
|
|
4377
|
+
(method as any).verifyProtocolV2ReconnectIdentity = jest.fn().mockResolvedValue(undefined);
|
|
4378
|
+
|
|
4379
|
+
try {
|
|
4380
|
+
await expect(
|
|
4381
|
+
(method as any).waitForProtocolV2FirmwareUpdateComplete([
|
|
4382
|
+
{ target_id: 4, path: 'vol0:/application_p1.bin' },
|
|
4383
|
+
])
|
|
4384
|
+
).rejects.toMatchObject({
|
|
4385
|
+
errorCode: HardwareErrorCode.FirmwareVerificationFailed,
|
|
4386
|
+
message: expect.stringContaining('reached payload version 65536, expected 131072'),
|
|
4387
|
+
});
|
|
4388
|
+
} finally {
|
|
4389
|
+
dateNowSpy.mockRestore();
|
|
4390
|
+
setTimeoutSpy.mockRestore();
|
|
4391
|
+
}
|
|
4392
|
+
|
|
4393
|
+
expect(typedCall).toHaveBeenCalledTimes(1);
|
|
4394
|
+
});
|
|
4395
|
+
|
|
4396
|
+
test('fails install polling immediately with the original status conflict error', async () => {
|
|
4397
|
+
const method = new FirmwareUpdateV4({
|
|
4398
|
+
id: 1,
|
|
4399
|
+
payload: {
|
|
4400
|
+
method: 'firmwareUpdateV4',
|
|
4401
|
+
},
|
|
4402
|
+
});
|
|
4403
|
+
const typedCall = jest.fn().mockResolvedValue({
|
|
4404
|
+
type: 'DeviceFirmwareUpdateStatus',
|
|
4405
|
+
message: {
|
|
4406
|
+
records: [{ target_id: 4, status: 2, path: 'vol0:/unexpected.bin' }],
|
|
4407
|
+
},
|
|
4408
|
+
});
|
|
4409
|
+
const dateNowSpy = jest
|
|
4410
|
+
.spyOn(Date, 'now')
|
|
4411
|
+
.mockReturnValueOnce(0)
|
|
4412
|
+
.mockReturnValueOnce(0)
|
|
4413
|
+
.mockReturnValue(300_001);
|
|
4414
|
+
const setTimeoutSpy = jest.spyOn(global, 'setTimeout').mockImplementation(((
|
|
4415
|
+
callback: () => void
|
|
4416
|
+
) => {
|
|
4417
|
+
callback();
|
|
4418
|
+
return 0 as any;
|
|
4419
|
+
}) as typeof setTimeout);
|
|
4420
|
+
|
|
4421
|
+
(method as any).device = stubDevice({
|
|
4422
|
+
getCommands: () => ({ typedCall }),
|
|
4423
|
+
});
|
|
4424
|
+
(method as any).reconnectProtocolV2Device = jest.fn().mockResolvedValue(undefined);
|
|
4425
|
+
(method as any).verifyProtocolV2ReconnectIdentity = jest.fn().mockResolvedValue(undefined);
|
|
4426
|
+
|
|
4427
|
+
try {
|
|
4428
|
+
await expect(
|
|
4429
|
+
(method as any).waitForProtocolV2FirmwareUpdateComplete([
|
|
4430
|
+
{ target_id: 4, path: 'vol0:/application_p1.bin' },
|
|
4431
|
+
])
|
|
4432
|
+
).rejects.toMatchObject({
|
|
4433
|
+
errorCode: HardwareErrorCode.RuntimeError,
|
|
4434
|
+
message: 'Protocol V2 install status conflicts with target 4',
|
|
4435
|
+
params: {
|
|
4436
|
+
firmwareUpdateCode: 'FirmwareInstallStatusConflict',
|
|
4437
|
+
},
|
|
4438
|
+
});
|
|
4439
|
+
} finally {
|
|
4440
|
+
dateNowSpy.mockRestore();
|
|
4441
|
+
setTimeoutSpy.mockRestore();
|
|
4442
|
+
}
|
|
4443
|
+
|
|
4444
|
+
expect(typedCall).toHaveBeenCalledTimes(1);
|
|
4445
|
+
});
|
|
4446
|
+
|
|
4343
4447
|
test('does not fail a completed multi-app install when final app versions are unobservable', () => {
|
|
4344
4448
|
const method = new FirmwareUpdateV4({
|
|
4345
4449
|
id: 1,
|
|
@@ -6,7 +6,6 @@ import type { FirmwareUpdatePreparedPlan } from '../types/api/firmwareUpdatePrep
|
|
|
6
6
|
type Params = {
|
|
7
7
|
binary?: ArrayBuffer;
|
|
8
8
|
artifact?: FirmwareArtifactReference;
|
|
9
|
-
resourceArtifact?: FirmwareArtifactReference;
|
|
10
9
|
resourceEntries?: Array<{
|
|
11
10
|
entryName: string;
|
|
12
11
|
artifact: FirmwareArtifactReference;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirmwareUpdateV2.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV2.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,QAAQ,EAEb,KAAK,aAAa,EAKnB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAyB1C,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,UAAU,CAAC;AAEtD,OAAO,KAAK,EACV,sBAAsB,EACtB,yBAAyB,EAC1B,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AAE1F,KAAK,MAAM,GAAG;IACZ,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,yBAAyB,CAAC;IACrC,
|
|
1
|
+
{"version":3,"file":"FirmwareUpdateV2.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV2.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,QAAQ,EAEb,KAAK,aAAa,EAKnB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAyB1C,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,UAAU,CAAC;AAEtD,OAAO,KAAK,EACV,sBAAsB,EACtB,yBAAyB,EAC1B,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AAE1F,KAAK,MAAM,GAAG;IACZ,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,yBAAyB,CAAC;IACrC,eAAe,CAAC,EAAE,KAAK,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,yBAAyB,CAAC;KACrC,CAAC,CAAC;IACH,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC,YAAY,CAAC,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,CAAC,EAAE,0BAA0B,CAAC,UAAU,CAAC,CAAC;IAClD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,UAAU,GAAG,KAAK,CAAC;IAC/B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,aAAa,CAAC;CAC9B,CAAC;AAkFF,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,UAAU,CAAC,MAAM,CAAC;IAC9D,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAQ;IAE1C,IAAI;IAuEJ,cAAc,YAAa,MAAM,UAS/B;YAEY,qCAAqC;IAkBnD,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;YA6FvC,4BAA4B;IAuB1C,qBAAqB;IAUrB,uBAAuB,CAAC,UAAU,EAAE,MAAM;IAc1C,gCAAgC,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAAE,YAAY,EAAE,aAAa;IAwBtF,GAAG;CAgQV"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirmwareUpdateV4.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV4.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAkB/E,OAAO,KAAK,EAEV,sBAAsB,EAEvB,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"FirmwareUpdateV4.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV4.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAkB/E,OAAO,KAAK,EAEV,sBAAsB,EAEvB,MAAM,6BAA6B,CAAC;AAmWrC,eAAO,MAAM,oCAAoC,WACvC,WAAW,GAAG,UAAU,eACnB,MAAM,GAAG,SAAS,YAKhC,CAAC;AAEF,eAAO,MAAM,iCAAiC,0BACrB,MAAM,uBACR,MAAM,SAc5B,CAAC;AAUF,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,wBAAwB,CAAC,sBAAsB,CAAC;IAC5F,OAAO,CAAC,8BAA8B,CAAC,CAAS;IAEhD,qBAAqB;IAIrB,OAAO,CAAC,yBAAyB,CAA4B;IAE7D,OAAO,CAAC,2BAA2B,CAAS;IAE5C,OAAO,CAAC,iCAAiC,CAA6B;IAEtE,OAAO,CAAC,6BAA6B,CAAC,CAAW;IAEjD,OAAO,CAAC,6BAA6B,CAAS;IAE9C,IAAI;IAoHJ,OAAO,CAAC,8BAA8B;IAoBhC,GAAG;;;;;YAKK,aAAa;YAsEb,4BAA4B;YAkB5B,0BAA0B;YAY1B,8BAA8B;YAK9B,+BAA+B;YAqD/B,gCAAgC;YAmDhC,8BAA8B;IAsB5C,OAAO,CAAC,8BAA8B;IA0BtC,OAAO,CAAC,kCAAkC;IAc1C,OAAO,CAAC,gCAAgC;IAsDxC,OAAO,CAAC,6BAA6B;YAsBvB,2BAA2B;IAWzC,OAAO,CAAC,yBAAyB;IAKjC,OAAO,CAAC,kCAAkC;YAO5B,iCAAiC;YAOjC,iCAAiC;YAgBjC,iCAAiC;IAM/C,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,4BAA4B;IAQpC,OAAO,CAAC,2BAA2B;IAsBnC,OAAO,CAAC,yBAAyB;IAiBjC,OAAO,CAAC,wBAAwB;IAkBhC,OAAO,CAAC,6BAA6B;YAMvB,8BAA8B;YA6C9B,iCAAiC;YAmCjC,+BAA+B;IAiE7C,OAAO,CAAC,gCAAgC;YAyC1B,oCAAoC;YA6DpC,kCAAkC;IAgChD,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,yBAAyB;IAU3B,6BAA6B;YA+BrB,+BAA+B;IA6C7C,OAAO,CAAC,6BAA6B;IAkCrC,OAAO,CAAC,8BAA8B;YA8CxB,uBAAuB;YAiCvB,6BAA6B;YAa7B,uBAAuB;YA6CvB,8BAA8B;YA2D9B,6BAA6B;IA0D3C,OAAO,CAAC,mCAAmC;YAI7B,0BAA0B;IAaxC,OAAO,CAAC,4BAA4B;YAyGtB,uCAAuC;YAsFvC,gCAAgC;YAShC,yBAAyB;YAQzB,8BAA8B;YAsB9B,mCAAmC;YAWnC,qCAAqC;YA2CrC,yBAAyB;YAiDzB,8BAA8B;IAU5C,OAAO,CAAC,kCAAkC;YAI5B,cAAc;YA+Bd,6BAA6B;YAW7B,0BAA0B;YAS1B,6BAA6B;YAmB7B,gBAAgB;IAiB9B,OAAO,CAAC,qBAAqB;CAM9B"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1264,7 +1264,6 @@ interface FirmwareUpdateArtifactParams {
|
|
|
1264
1264
|
preparedPlan: FirmwareUpdatePreparedPlan;
|
|
1265
1265
|
hostBindingGeneration: number;
|
|
1266
1266
|
artifact: FirmwareArtifactReference;
|
|
1267
|
-
resourceArtifact?: FirmwareArtifactReference;
|
|
1268
1267
|
resourceEntries?: Array<{
|
|
1269
1268
|
entryName: string;
|
|
1270
1269
|
artifact: FirmwareArtifactReference;
|
package/dist/index.js
CHANGED
|
@@ -48699,7 +48699,7 @@ class DeviceUpdateBootloader extends FirmwareUpdateBaseMethod {
|
|
|
48699
48699
|
return true;
|
|
48700
48700
|
}
|
|
48701
48701
|
finally {
|
|
48702
|
-
yield source.close();
|
|
48702
|
+
yield source.close().catch(() => undefined);
|
|
48703
48703
|
}
|
|
48704
48704
|
}
|
|
48705
48705
|
const { binary } = payload;
|
|
@@ -49064,16 +49064,11 @@ class FirmwareUpdateV2 extends BaseMethod {
|
|
|
49064
49064
|
if ('artifact' in payload) {
|
|
49065
49065
|
const hostBinding = resolveFirmwareUpdateHostBinding(payload.hostBindingGeneration);
|
|
49066
49066
|
const target = payload.isUpdateBootloader ? 'bootloader' : payload.updateType;
|
|
49067
|
-
const resourceBindings = [
|
|
49068
|
-
|
|
49069
|
-
|
|
49070
|
-
|
|
49071
|
-
|
|
49072
|
-
target: 'resource',
|
|
49073
|
-
entryName: entry.entryName,
|
|
49074
|
-
artifact: entry.artifact,
|
|
49075
|
-
})),
|
|
49076
|
-
];
|
|
49067
|
+
const resourceBindings = ((_a = payload.resourceEntries) !== null && _a !== void 0 ? _a : []).map((entry) => ({
|
|
49068
|
+
target: 'resource',
|
|
49069
|
+
entryName: entry.entryName,
|
|
49070
|
+
artifact: entry.artifact,
|
|
49071
|
+
}));
|
|
49077
49072
|
assertFirmwareUpdatePreparedPlanBinding({
|
|
49078
49073
|
preparedPlan: payload.preparedPlan,
|
|
49079
49074
|
executor: 'v2',
|
|
@@ -49081,7 +49076,7 @@ class FirmwareUpdateV2 extends BaseMethod {
|
|
|
49081
49076
|
scopeTargets: [target, ...(target === 'firmware' ? ['resource'] : [])],
|
|
49082
49077
|
bindings: [{ target, artifact: payload.artifact }, ...resourceBindings],
|
|
49083
49078
|
});
|
|
49084
|
-
this.params = Object.assign(Object.assign({}, this.params), { preparedPlan: payload.preparedPlan, artifact: payload.artifact,
|
|
49079
|
+
this.params = Object.assign(Object.assign({}, this.params), { preparedPlan: payload.preparedPlan, artifact: payload.artifact, resourceEntries: payload.resourceEntries, artifactReader: hostBinding.artifactReader });
|
|
49085
49080
|
}
|
|
49086
49081
|
}
|
|
49087
49082
|
_promptDeviceInBootloaderForWebDevice() {
|
|
@@ -49357,23 +49352,15 @@ class FirmwareUpdateV2 extends BaseMethod {
|
|
|
49357
49352
|
this.postTipMessage('DownloadLatestUiResourceSuccess');
|
|
49358
49353
|
}
|
|
49359
49354
|
else {
|
|
49360
|
-
|
|
49361
|
-
|
|
49362
|
-
throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, 'Firmware resource
|
|
49355
|
+
if (params.artifactReader ||
|
|
49356
|
+
DataManager.getSettings('firmwareManifestMode') === 'external-only') {
|
|
49357
|
+
throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, 'Firmware resource must be prepared by the external firmware host', {
|
|
49363
49358
|
firmwareUpdateCode: 'FirmwareArtifactsNotPrepared',
|
|
49364
49359
|
artifactName: 'resource',
|
|
49365
49360
|
});
|
|
49366
49361
|
}
|
|
49367
|
-
|
|
49368
|
-
|
|
49369
|
-
DataManager.getSettings('firmwareManifestMode') === 'external-only') {
|
|
49370
|
-
throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, 'Firmware resource must be prepared by the external firmware host', {
|
|
49371
|
-
firmwareUpdateCode: 'FirmwareArtifactsNotPrepared',
|
|
49372
|
-
artifactName: 'resource',
|
|
49373
|
-
});
|
|
49374
|
-
}
|
|
49375
|
-
resourceBinary = (yield getSysResourceBinary(resourceUrl)).binary;
|
|
49376
|
-
}
|
|
49362
|
+
const resourceBinary = (yield getSysResourceBinary(resourceUrl))
|
|
49363
|
+
.binary;
|
|
49377
49364
|
this.postTipMessage('DownloadLatestUiResourceSuccess');
|
|
49378
49365
|
yield updateResources(this.device.getCommands().typedCall.bind(this.device.getCommands()), this.postMessage, device, resourceBinary);
|
|
49379
49366
|
}
|
|
@@ -50135,6 +50122,7 @@ const PROTOCOL_V2_CONNECT_POLL_INTERVAL = 500;
|
|
|
50135
50122
|
const PROTOCOL_V2_CONNECT_SINGLE_TIMEOUT = 75 * 1000;
|
|
50136
50123
|
const PROTOCOL_V2_DEVICE_INFO_READY_TIMEOUT = 60 * 1000;
|
|
50137
50124
|
const PROTOCOL_V2_FILE_TRANSFER_RETRY_COUNT = 3;
|
|
50125
|
+
const PROTOCOL_V2_INSTALL_STATUS_CONFLICT_CODE = 'FirmwareInstallStatusConflict';
|
|
50138
50126
|
const PROTOCOL_V2_OKPP_HEADER_SIZE = 0x52a0;
|
|
50139
50127
|
const PROTOCOL_V2_OKPP_PAYLOAD_HASH_OFFSET = 0x200;
|
|
50140
50128
|
const PROTOCOL_V2_OKPP_HEADER_HASH_OFFSET = 0x240;
|
|
@@ -50229,6 +50217,13 @@ const isProtocolV2FirmwareStatusEndpointUnavailable = (error) => {
|
|
|
50229
50217
|
message.includes('message handler not found') ||
|
|
50230
50218
|
message.includes('unsupported message'));
|
|
50231
50219
|
};
|
|
50220
|
+
const isProtocolV2TerminalInstallStatusError = (error) => {
|
|
50221
|
+
var _a;
|
|
50222
|
+
return error instanceof hdShared.HardwareError &&
|
|
50223
|
+
(error.errorCode === hdShared.HardwareErrorCode.FirmwareError ||
|
|
50224
|
+
error.errorCode === hdShared.HardwareErrorCode.FirmwareVerificationFailed ||
|
|
50225
|
+
((_a = error.params) === null || _a === void 0 ? void 0 : _a.firmwareUpdateCode) === PROTOCOL_V2_INSTALL_STATUS_CONFLICT_CODE);
|
|
50226
|
+
};
|
|
50232
50227
|
const isProtocolV2TargetStatusFinished = (status) => normalizeProtocolV2TargetStatus(status) === PROTOCOL_V2_TARGET_STATUS_FINISHED;
|
|
50233
50228
|
const isProtocolV2TargetStatusInProgress = (status) => normalizeProtocolV2TargetStatus(status) === PROTOCOL_V2_TARGET_STATUS_PENDING ||
|
|
50234
50229
|
normalizeProtocolV2TargetStatus(status) === PROTOCOL_V2_TARGET_STATUS_IN_PROGRESS;
|
|
@@ -51410,7 +51405,9 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
|
|
|
51410
51405
|
if (targetId === undefined ||
|
|
51411
51406
|
seenTargetIds.has(targetId) ||
|
|
51412
51407
|
(target.path && expectedPaths.get(targetId) && target.path !== expectedPaths.get(targetId))) {
|
|
51413
|
-
throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, `Protocol V2 install status conflicts with target ${target.target_id}
|
|
51408
|
+
throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, `Protocol V2 install status conflicts with target ${target.target_id}`, {
|
|
51409
|
+
firmwareUpdateCode: PROTOCOL_V2_INSTALL_STATUS_CONFLICT_CODE,
|
|
51410
|
+
});
|
|
51414
51411
|
}
|
|
51415
51412
|
seenTargetIds.add(targetId);
|
|
51416
51413
|
}
|
|
@@ -51477,8 +51474,7 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
|
|
|
51477
51474
|
lastError = new Error('Protocol V2 firmware targets are still installing');
|
|
51478
51475
|
}
|
|
51479
51476
|
catch (error) {
|
|
51480
|
-
if (error
|
|
51481
|
-
error.errorCode === hdShared.HardwareErrorCode.FirmwareError) {
|
|
51477
|
+
if (isProtocolV2TerminalInstallStatusError(error)) {
|
|
51482
51478
|
throw error;
|
|
51483
51479
|
}
|
|
51484
51480
|
if (isProtocolV2FirmwareStatusEndpointUnavailable(error)) {
|
|
@@ -51499,7 +51495,7 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
|
|
|
51499
51495
|
if (this.isProtocolV2ReconnectIdentityError(error)) {
|
|
51500
51496
|
throw error;
|
|
51501
51497
|
}
|
|
51502
|
-
if (error
|
|
51498
|
+
if (isProtocolV2TerminalInstallStatusError(error)) {
|
|
51503
51499
|
throw error;
|
|
51504
51500
|
}
|
|
51505
51501
|
if (error instanceof hdShared.HardwareError &&
|
|
@@ -39,7 +39,6 @@ export interface FirmwareUpdateArtifactParams {
|
|
|
39
39
|
preparedPlan: FirmwareUpdatePreparedPlan;
|
|
40
40
|
hostBindingGeneration: number;
|
|
41
41
|
artifact: FirmwareArtifactReference;
|
|
42
|
-
resourceArtifact?: FirmwareArtifactReference;
|
|
43
42
|
resourceEntries?: Array<{
|
|
44
43
|
entryName: string;
|
|
45
44
|
artifact: FirmwareArtifactReference;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firmwareUpdate.d.ts","sourceRoot":"","sources":["../../../src/types/api/firmwareUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE/E,KAAK,WAAW,GAAG,UAAU,GAAG,KAAK,CAAC;AAEtC,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAC5C,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,IAAI,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QACzE,IAAI,EAAE,WAAW,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,GAAG,EAAE,OAAO,CAAC;KACd,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,yBAAyB;IACxC,cAAc,EAAE,sBAAsB,CAAC;CACxC;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,WAAW,CAAC;CACzB;AAED,MAAM,WAAW,4BAA4B;IAC3C,YAAY,EAAE,0BAA0B,CAAC;IACzC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,yBAAyB,CAAC;IACpC,
|
|
1
|
+
{"version":3,"file":"firmwareUpdate.d.ts","sourceRoot":"","sources":["../../../src/types/api/firmwareUpdate.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.2.0-alpha.
|
|
3
|
+
"version": "1.2.0-alpha.67",
|
|
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.0-alpha.
|
|
29
|
-
"@onekeyfe/hd-transport": "1.2.0-alpha.
|
|
28
|
+
"@onekeyfe/hd-shared": "1.2.0-alpha.67",
|
|
29
|
+
"@onekeyfe/hd-transport": "1.2.0-alpha.67",
|
|
30
30
|
"axios": "1.15.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": "5fea66e8c65a1fab2ccc099b2811c8749b2487e0"
|
|
48
48
|
}
|
|
@@ -46,7 +46,6 @@ import type { FirmwareUpdatePreparedPlan } from '../types/api/firmwareUpdatePrep
|
|
|
46
46
|
type Params = {
|
|
47
47
|
binary?: ArrayBuffer;
|
|
48
48
|
artifact?: FirmwareArtifactReference;
|
|
49
|
-
resourceArtifact?: FirmwareArtifactReference;
|
|
50
49
|
resourceEntries?: Array<{
|
|
51
50
|
entryName: string;
|
|
52
51
|
artifact: FirmwareArtifactReference;
|
|
@@ -191,18 +190,13 @@ export default class FirmwareUpdateV2 extends BaseMethod<Params> {
|
|
|
191
190
|
if ('artifact' in payload) {
|
|
192
191
|
const hostBinding = resolveFirmwareUpdateHostBinding(payload.hostBindingGeneration);
|
|
193
192
|
const target = payload.isUpdateBootloader ? 'bootloader' : payload.updateType;
|
|
194
|
-
const resourceBindings = [
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
:
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
entryName: entry.entryName,
|
|
202
|
-
artifact: entry.artifact,
|
|
203
|
-
})
|
|
204
|
-
),
|
|
205
|
-
];
|
|
193
|
+
const resourceBindings = (payload.resourceEntries ?? []).map(
|
|
194
|
+
(entry: { entryName: string; artifact: FirmwareArtifactReference }) => ({
|
|
195
|
+
target: 'resource' as const,
|
|
196
|
+
entryName: entry.entryName,
|
|
197
|
+
artifact: entry.artifact,
|
|
198
|
+
})
|
|
199
|
+
);
|
|
206
200
|
assertFirmwareUpdatePreparedPlanBinding({
|
|
207
201
|
preparedPlan: payload.preparedPlan,
|
|
208
202
|
executor: 'v2',
|
|
@@ -214,7 +208,6 @@ export default class FirmwareUpdateV2 extends BaseMethod<Params> {
|
|
|
214
208
|
...this.params,
|
|
215
209
|
preparedPlan: payload.preparedPlan,
|
|
216
210
|
artifact: payload.artifact,
|
|
217
|
-
resourceArtifact: payload.resourceArtifact,
|
|
218
211
|
resourceEntries: payload.resourceEntries,
|
|
219
212
|
artifactReader: hostBinding.artifactReader,
|
|
220
213
|
};
|
|
@@ -576,32 +569,21 @@ export default class FirmwareUpdateV2 extends BaseMethod<Params> {
|
|
|
576
569
|
}
|
|
577
570
|
this.postTipMessage('DownloadLatestUiResourceSuccess');
|
|
578
571
|
} else {
|
|
579
|
-
|
|
580
|
-
|
|
572
|
+
if (
|
|
573
|
+
params.artifactReader ||
|
|
574
|
+
DataManager.getSettings('firmwareManifestMode') === 'external-only'
|
|
575
|
+
) {
|
|
581
576
|
throw ERRORS.TypedError(
|
|
582
577
|
HardwareErrorCode.RuntimeError,
|
|
583
|
-
'Firmware resource
|
|
578
|
+
'Firmware resource must be prepared by the external firmware host',
|
|
584
579
|
{
|
|
585
580
|
firmwareUpdateCode: 'FirmwareArtifactsNotPrepared',
|
|
586
581
|
artifactName: 'resource',
|
|
587
582
|
}
|
|
588
583
|
);
|
|
589
|
-
} else {
|
|
590
|
-
if (
|
|
591
|
-
params.artifactReader ||
|
|
592
|
-
DataManager.getSettings('firmwareManifestMode') === 'external-only'
|
|
593
|
-
) {
|
|
594
|
-
throw ERRORS.TypedError(
|
|
595
|
-
HardwareErrorCode.RuntimeError,
|
|
596
|
-
'Firmware resource must be prepared by the external firmware host',
|
|
597
|
-
{
|
|
598
|
-
firmwareUpdateCode: 'FirmwareArtifactsNotPrepared',
|
|
599
|
-
artifactName: 'resource',
|
|
600
|
-
}
|
|
601
|
-
);
|
|
602
|
-
}
|
|
603
|
-
resourceBinary = (await getSysResourceBinary(resourceUrl)).binary;
|
|
604
584
|
}
|
|
585
|
+
const resourceBinary: ArrayBuffer | Buffer = (await getSysResourceBinary(resourceUrl))
|
|
586
|
+
.binary;
|
|
605
587
|
this.postTipMessage('DownloadLatestUiResourceSuccess');
|
|
606
588
|
await updateResources(
|
|
607
589
|
this.device.getCommands().typedCall.bind(this.device.getCommands()),
|
|
@@ -75,6 +75,7 @@ const PROTOCOL_V2_CONNECT_POLL_INTERVAL = 500;
|
|
|
75
75
|
const PROTOCOL_V2_CONNECT_SINGLE_TIMEOUT = 75 * 1000;
|
|
76
76
|
const PROTOCOL_V2_DEVICE_INFO_READY_TIMEOUT = 60 * 1000;
|
|
77
77
|
const PROTOCOL_V2_FILE_TRANSFER_RETRY_COUNT = 3;
|
|
78
|
+
const PROTOCOL_V2_INSTALL_STATUS_CONFLICT_CODE = 'FirmwareInstallStatusConflict';
|
|
78
79
|
const PROTOCOL_V2_OKPP_HEADER_SIZE = 0x52a0;
|
|
79
80
|
const PROTOCOL_V2_OKPP_PAYLOAD_HASH_OFFSET = 0x200;
|
|
80
81
|
const PROTOCOL_V2_OKPP_HEADER_HASH_OFFSET = 0x240;
|
|
@@ -263,6 +264,12 @@ const isProtocolV2FirmwareStatusEndpointUnavailable = (error: unknown) => {
|
|
|
263
264
|
);
|
|
264
265
|
};
|
|
265
266
|
|
|
267
|
+
const isProtocolV2TerminalInstallStatusError = (error: unknown) =>
|
|
268
|
+
error instanceof HardwareError &&
|
|
269
|
+
(error.errorCode === HardwareErrorCode.FirmwareError ||
|
|
270
|
+
error.errorCode === HardwareErrorCode.FirmwareVerificationFailed ||
|
|
271
|
+
error.params?.firmwareUpdateCode === PROTOCOL_V2_INSTALL_STATUS_CONFLICT_CODE);
|
|
272
|
+
|
|
266
273
|
const isProtocolV2TargetStatusFinished = (status: ProtocolV2FirmwareUpdateStatusTarget['status']) =>
|
|
267
274
|
normalizeProtocolV2TargetStatus(status) === PROTOCOL_V2_TARGET_STATUS_FINISHED;
|
|
268
275
|
|
|
@@ -1782,7 +1789,10 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
1782
1789
|
) {
|
|
1783
1790
|
throw ERRORS.TypedError(
|
|
1784
1791
|
HardwareErrorCode.RuntimeError,
|
|
1785
|
-
`Protocol V2 install status conflicts with target ${target.target_id}
|
|
1792
|
+
`Protocol V2 install status conflicts with target ${target.target_id}`,
|
|
1793
|
+
{
|
|
1794
|
+
firmwareUpdateCode: PROTOCOL_V2_INSTALL_STATUS_CONFLICT_CODE,
|
|
1795
|
+
}
|
|
1786
1796
|
);
|
|
1787
1797
|
}
|
|
1788
1798
|
seenTargetIds.add(targetId);
|
|
@@ -1878,10 +1888,7 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
1878
1888
|
}
|
|
1879
1889
|
lastError = new Error('Protocol V2 firmware targets are still installing');
|
|
1880
1890
|
} catch (error) {
|
|
1881
|
-
if (
|
|
1882
|
-
error instanceof HardwareError &&
|
|
1883
|
-
error.errorCode === HardwareErrorCode.FirmwareError
|
|
1884
|
-
) {
|
|
1891
|
+
if (isProtocolV2TerminalInstallStatusError(error)) {
|
|
1885
1892
|
throw error;
|
|
1886
1893
|
}
|
|
1887
1894
|
// App firmware does not register DeviceFirmwareUpdateStatusGet. Treat the
|
|
@@ -1909,7 +1916,7 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
1909
1916
|
if (this.isProtocolV2ReconnectIdentityError(error)) {
|
|
1910
1917
|
throw error;
|
|
1911
1918
|
}
|
|
1912
|
-
if (error
|
|
1919
|
+
if (isProtocolV2TerminalInstallStatusError(error)) {
|
|
1913
1920
|
throw error;
|
|
1914
1921
|
}
|
|
1915
1922
|
if (
|
|
@@ -37,7 +37,6 @@ export interface FirmwareUpdateArtifactParams {
|
|
|
37
37
|
preparedPlan: FirmwareUpdatePreparedPlan;
|
|
38
38
|
hostBindingGeneration: number;
|
|
39
39
|
artifact: FirmwareArtifactReference;
|
|
40
|
-
resourceArtifact?: FirmwareArtifactReference;
|
|
41
40
|
resourceEntries?: Array<{
|
|
42
41
|
entryName: string;
|
|
43
42
|
artifact: FirmwareArtifactReference;
|