@onekeyfe/hd-core 1.2.0-alpha.80 → 1.2.0-alpha.82

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.
@@ -162,3 +162,33 @@ describe.each(['pro2', 'neo'] as const)('Protocol V2 release checks for %s', dev
162
162
  expect(allMethod.getSupportedProtocols()).toEqual(['V1', 'V2']);
163
163
  });
164
164
  });
165
+
166
+ test('returns null from optional release probes when device features are unavailable', async () => {
167
+ const deviceWithoutFeatures = {
168
+ isProtocolV2: jest.fn(() => true),
169
+ features: undefined,
170
+ getDeviceState: jest.fn(),
171
+ };
172
+ const firmwareMethod = new CheckFirmwareRelease({
173
+ id: 1,
174
+ payload: { method: 'checkFirmwareRelease' },
175
+ });
176
+ const bleMethod = new CheckBLEFirmwareRelease({
177
+ id: 2,
178
+ payload: { method: 'checkBLEFirmwareRelease' },
179
+ });
180
+ const bootloaderMethod = new CheckBootloaderRelease({
181
+ id: 3,
182
+ payload: { method: 'checkBootloaderRelease' },
183
+ });
184
+
185
+ firmwareMethod.device = deviceWithoutFeatures as unknown as CheckFirmwareRelease['device'];
186
+ bleMethod.device = deviceWithoutFeatures as unknown as CheckBLEFirmwareRelease['device'];
187
+ bootloaderMethod.device = deviceWithoutFeatures as unknown as CheckBootloaderRelease['device'];
188
+
189
+ await expect(firmwareMethod.run()).resolves.toBeNull();
190
+ await expect(bleMethod.run()).resolves.toBeNull();
191
+ await expect(bootloaderMethod.run()).resolves.toBeNull();
192
+ expect(deviceWithoutFeatures.isProtocolV2).not.toHaveBeenCalled();
193
+ expect(deviceWithoutFeatures.getDeviceState).not.toHaveBeenCalled();
194
+ });
@@ -5860,6 +5860,80 @@ describe('Protocol V2 firmware update targets', () => {
5860
5860
  getFirmwareLatestReleaseSpy.mockRestore();
5861
5861
  });
5862
5862
 
5863
+ test('downloads only firmware targets that are missing from an explicit mixed payload', async () => {
5864
+ const explicitApplicationBinary = new Uint8Array([1]).buffer;
5865
+ const remoteCoprocessorBinary = new Uint8Array([2]).buffer;
5866
+ const method = new FirmwareUpdateV4({
5867
+ id: 1,
5868
+ payload: {
5869
+ method: 'firmwareUpdateV4',
5870
+ platform: 'web',
5871
+ targetsToUpdate: ['app_v1', 'coprocessor'],
5872
+ },
5873
+ });
5874
+ method.init();
5875
+
5876
+ const getSysResourceBinarySpy = jest
5877
+ .spyOn(firmwareBinaryApi, 'getSysResourceBinary')
5878
+ .mockResolvedValue({ binary: remoteCoprocessorBinary });
5879
+ const getFirmwareLatestReleaseSpy = jest
5880
+ .spyOn(DataManager, 'getFirmwareLatestRelease')
5881
+ .mockReturnValue({
5882
+ required: false,
5883
+ version: [1, 0, 0],
5884
+ url: 'https://example.com/applicationP1.pp.bin',
5885
+ installOrder: ['applicationP1', 'coprocessor'],
5886
+ components: {
5887
+ applicationP1: {
5888
+ target: 'APPLICATION_P1',
5889
+ url: 'https://example.com/applicationP1.pp.bin',
5890
+ },
5891
+ coprocessor: {
5892
+ target: 'COPROCESSOR',
5893
+ url: 'https://example.com/coprocessor.pp.bin',
5894
+ },
5895
+ },
5896
+ fingerprint: '',
5897
+ changelog: {
5898
+ 'zh-CN': '',
5899
+ 'en-US': '',
5900
+ },
5901
+ });
5902
+
5903
+ const remoteBinaries = await (method as any).prepareRemoteProtocolV2Binaries(
5904
+ 'universal',
5905
+ { deviceType: 'pro2', firmwareVersion: '0.0.0' },
5906
+ [
5907
+ {
5908
+ fileName: 'application_p1.bin',
5909
+ binary: explicitApplicationBinary,
5910
+ targetId: 4,
5911
+ kind: 'firmware',
5912
+ },
5913
+ ]
5914
+ );
5915
+
5916
+ expect(getSysResourceBinarySpy).toHaveBeenCalledTimes(1);
5917
+ expect(getSysResourceBinarySpy).toHaveBeenCalledWith('https://example.com/coprocessor.pp.bin');
5918
+ expect(remoteBinaries.installItems).toEqual([
5919
+ {
5920
+ fileName: 'application_p1.bin',
5921
+ binary: explicitApplicationBinary,
5922
+ targetId: 4,
5923
+ kind: 'firmware',
5924
+ },
5925
+ {
5926
+ fileName: 'coprocessor.bin',
5927
+ binary: remoteCoprocessorBinary,
5928
+ targetId: 6,
5929
+ kind: 'firmware',
5930
+ },
5931
+ ]);
5932
+
5933
+ getSysResourceBinarySpy.mockRestore();
5934
+ getFirmwareLatestReleaseSpy.mockRestore();
5935
+ });
5936
+
5863
5937
  test('ignores an unsupported remote ROMLOADER component when installing selected targets', async () => {
5864
5938
  const method = new FirmwareUpdateV4({
5865
5939
  id: 1,
@@ -6195,6 +6269,108 @@ describe('Protocol V2 firmware update targets', () => {
6195
6269
  );
6196
6270
  });
6197
6271
 
6272
+ test('downloads every missing firmware target when manifest resources are already prepared', async () => {
6273
+ const resourceBundle = createProtocolV2OkppBinary();
6274
+ const applicationBinary = new Uint8Array([7]).buffer;
6275
+ const remoteBinaries = {
6276
+ bootloaderBinary: null,
6277
+ fwBinaryMap: [
6278
+ {
6279
+ fileName: 'application_p1.bin',
6280
+ binary: applicationBinary,
6281
+ targetId: 4,
6282
+ },
6283
+ ],
6284
+ installItems: [
6285
+ {
6286
+ fileName: 'application_p1.bin',
6287
+ binary: applicationBinary,
6288
+ targetId: 4,
6289
+ kind: 'firmware',
6290
+ },
6291
+ ],
6292
+ };
6293
+ const method = new FirmwareUpdateV4({
6294
+ id: 1,
6295
+ payload: {
6296
+ method: 'firmwareUpdateV4',
6297
+ platform: 'web',
6298
+ targetsToUpdate: ['app_v1', 'resource'],
6299
+ resourceFiles: [
6300
+ {
6301
+ binary: resourceBundle,
6302
+ devicePath: 'vol0:/bundles/images/images.okpkg',
6303
+ },
6304
+ ],
6305
+ },
6306
+ });
6307
+ method.init();
6308
+ (method as any).captureProtocolV2PhysicalIdentity = jest.fn().mockResolvedValue(undefined);
6309
+ (method as any).device = stubDevice({
6310
+ originalDescriptor: { protocolType: 'V2' },
6311
+ features: { deviceType: 'pro2', firmwareVersion: '0.0.0', capabilities: [] },
6312
+ });
6313
+ (method as any).prepareRemoteProtocolV2Binaries = jest.fn().mockResolvedValue(remoteBinaries);
6314
+ (method as any).executeProtocolV2Update = jest.fn().mockResolvedValue(undefined);
6315
+ method.postTipMessage = jest.fn();
6316
+
6317
+ await method.run();
6318
+
6319
+ expect(forceReloadDataSpy).toHaveBeenCalledTimes(1);
6320
+ expect((method as any).prepareRemoteProtocolV2Binaries).toHaveBeenCalledWith(
6321
+ 'universal',
6322
+ expect.objectContaining({ deviceType: 'pro2' }),
6323
+ []
6324
+ );
6325
+ expect((method as any).executeProtocolV2Update).toHaveBeenCalledWith({
6326
+ bootloaderBinary: null,
6327
+ fwBinaryMap: remoteBinaries.fwBinaryMap,
6328
+ installItems: remoteBinaries.installItems,
6329
+ resourceBundles: [
6330
+ {
6331
+ name: 'images.okpkg',
6332
+ binary: resourceBundle,
6333
+ devicePath: 'vol0:/bundles/images/images.okpkg',
6334
+ version: [1, 2, 3],
6335
+ payloadHash: '11'.repeat(64),
6336
+ headerHash: '22'.repeat(64),
6337
+ },
6338
+ ],
6339
+ });
6340
+ });
6341
+
6342
+ test('rejects a mixed resource plan when the requested firmware release is unavailable', async () => {
6343
+ const resourceBundle = createProtocolV2OkppBinary();
6344
+ const method = new FirmwareUpdateV4({
6345
+ id: 1,
6346
+ payload: {
6347
+ method: 'firmwareUpdateV4',
6348
+ platform: 'web',
6349
+ targetsToUpdate: ['app_v1', 'resource'],
6350
+ resourceFiles: [
6351
+ {
6352
+ binary: resourceBundle,
6353
+ devicePath: 'vol0:/bundles/images/images.okpkg',
6354
+ },
6355
+ ],
6356
+ },
6357
+ });
6358
+ method.init();
6359
+ (method as any).captureProtocolV2PhysicalIdentity = jest.fn().mockResolvedValue(undefined);
6360
+ (method as any).device = stubDevice({
6361
+ originalDescriptor: { protocolType: 'V2' },
6362
+ features: { deviceType: 'pro2', firmwareVersion: '0.0.0', capabilities: [] },
6363
+ });
6364
+ jest.spyOn(DataManager, 'getFirmwareLatestRelease').mockReturnValue(undefined);
6365
+ (method as any).executeProtocolV2Update = jest.fn();
6366
+ method.postTipMessage = jest.fn();
6367
+
6368
+ await expect(method.run()).rejects.toThrow(
6369
+ 'Protocol V2 firmware release is unavailable for requested targets: app_v1'
6370
+ );
6371
+ expect((method as any).executeProtocolV2Update).not.toHaveBeenCalled();
6372
+ });
6373
+
6198
6374
  test('combines prepared firmware components with explicit manifest resource files', async () => {
6199
6375
  const resourceBundle = createProtocolV2OkppBinary();
6200
6376
  const method = new FirmwareUpdateV4({
@@ -10,6 +10,6 @@ export default class CheckBLEFirmwareRelease extends BaseMethod {
10
10
  }[];
11
11
  release: import("..").IBLEFirmwareReleaseInfo | undefined;
12
12
  bootloaderMode: boolean;
13
- }>;
13
+ } | null>;
14
14
  }
15
15
  //# sourceMappingURL=CheckBLEFirmwareRelease.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CheckBLEFirmwareRelease.d.ts","sourceRoot":"","sources":["../../src/api/CheckBLEFirmwareRelease.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAY1C,MAAM,CAAC,OAAO,OAAO,uBAAwB,SAAQ,UAAU;IAC7D,qBAAqB;IAIrB,IAAI;IAUE,GAAG;;;;;;;;;CA+BV"}
1
+ {"version":3,"file":"CheckBLEFirmwareRelease.d.ts","sourceRoot":"","sources":["../../src/api/CheckBLEFirmwareRelease.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAY1C,MAAM,CAAC,OAAO,OAAO,uBAAwB,SAAQ,UAAU;IAC7D,qBAAqB;IAIrB,IAAI;IAUE,GAAG;;;;;;;;;CA2BV"}
@@ -11,6 +11,6 @@ export default class CheckBootloaderRelease extends BaseMethod {
11
11
  release: import("..").IFirmwareReleaseInfo | undefined;
12
12
  bootloaderMode: boolean;
13
13
  shouldUpdate: boolean;
14
- }>;
14
+ } | null>;
15
15
  }
16
16
  //# sourceMappingURL=CheckBootloaderRelease.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CheckBootloaderRelease.d.ts","sourceRoot":"","sources":["../../src/api/CheckBootloaderRelease.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAc1C,MAAM,CAAC,OAAO,OAAO,sBAAuB,SAAQ,UAAU;IAC5D,qBAAqB;IAIrB,IAAI;IAME,GAAG;;;;;;;;;;CA0CV"}
1
+ {"version":3,"file":"CheckBootloaderRelease.d.ts","sourceRoot":"","sources":["../../src/api/CheckBootloaderRelease.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAc1C,MAAM,CAAC,OAAO,OAAO,sBAAuB,SAAQ,UAAU;IAC5D,qBAAqB;IAIrB,IAAI;IAME,GAAG;;;;;;;;;;CAqCV"}
@@ -10,6 +10,6 @@ export default class CheckFirmwareRelease extends BaseMethod {
10
10
  }[];
11
11
  release: import("..").IFirmwareReleaseInfo | undefined;
12
12
  bootloaderMode: boolean;
13
- }>;
13
+ } | null>;
14
14
  }
15
15
  //# sourceMappingURL=CheckFirmwareRelease.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CheckFirmwareRelease.d.ts","sourceRoot":"","sources":["../../src/api/CheckFirmwareRelease.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAa1C,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,UAAU;IAC1D,qBAAqB;IAIrB,IAAI;IAUE,GAAG;;;;;;;;;CAiCV"}
1
+ {"version":3,"file":"CheckFirmwareRelease.d.ts","sourceRoot":"","sources":["../../src/api/CheckFirmwareRelease.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAa1C,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,UAAU;IAC1D,qBAAqB;IAIrB,IAAI;IAUE,GAAG;;;;;;;;;CA6BV"}
@@ -40,6 +40,7 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
40
40
  private verifyProtocolV2ReconnectIdentity;
41
41
  private prepareBootloaderBinary;
42
42
  private hasExplicitProtocolV2Payload;
43
+ private getMissingProtocolV2FirmwareTargets;
43
44
  private buildProtocolV2InstallItems;
44
45
  private getRemoteComponentEntries;
45
46
  private getRemoteComponentTarget;
@@ -1 +1 @@
1
- {"version":3,"file":"FirmwareUpdateV4.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV4.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkD,MAAM,qBAAqB,CAAC;AAyBlG,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAmB/E,OAAO,KAAK,EAEV,sBAAsB,EAEvB,MAAM,6BAA6B,CAAC;AA6CrC,wBAAgB,wCAAwC,CACtD,UAAU,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,EAC5C,MAAM,EAAE,sBAAsB,QAgB/B;AA6UD,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,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;IAwBhC,GAAG;;;;;YAKK,aAAa;YAwGb,4BAA4B;YAkB5B,0BAA0B;YAY1B,8BAA8B;YAK9B,+BAA+B;YAqD/B,gCAAgC;YAmDhC,8BAA8B;IAkC5C,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;IAS1C,OAAO,CAAC,8BAA8B;YAMxB,iCAAiC;YAOjC,iCAAiC;YAkBjC,iCAAiC;IAM/C,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,4BAA4B;IAQpC,OAAO,CAAC,2BAA2B;IAsBnC,OAAO,CAAC,yBAAyB;IAiBjC,OAAO,CAAC,wBAAwB;YAkBlB,iCAAiC;YAmCjC,+BAA+B;IAqD7C,OAAO,CAAC,sCAAsC;IA0C9C,OAAO,CAAC,6BAA6B;YAMvB,8BAA8B;YA8C9B,kCAAkC;IA4BhD,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,yBAAyB;IAc3B,6BAA6B;YAgCrB,+BAA+B;IAkD7C,OAAO,CAAC,6BAA6B;IAkCrC,OAAO,CAAC,8BAA8B;YA8CxB,uBAAuB;YAiCvB,6BAA6B;YAa7B,uBAAuB;YA6CvB,8BAA8B;YA8D9B,6BAA6B;IAuE3C,OAAO,CAAC,mCAAmC;YAI7B,0BAA0B;IAaxC,OAAO,CAAC,4BAA4B;IAyGpC,OAAO,CAAC,6BAA6B;YAcvB,uCAAuC;YA0JvC,gCAAgC;YAehC,yBAAyB;YAQzB,8BAA8B;IAQ5C,OAAO,CAAC,0BAA0B;YAkBpB,mCAAmC;YAWnC,qCAAqC;YAgDrC,yBAAyB;YA8DzB,8BAA8B;IAU5C,OAAO,CAAC,kCAAkC;YAQ5B,cAAc;YAuCd,6BAA6B;YAW7B,0BAA0B;YAS1B,6BAA6B;YAmB7B,gBAAgB;IAiB9B,OAAO,CAAC,qBAAqB;CAM9B"}
1
+ {"version":3,"file":"FirmwareUpdateV4.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV4.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkD,MAAM,qBAAqB,CAAC;AAyBlG,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAmB/E,OAAO,KAAK,EAEV,sBAAsB,EAEvB,MAAM,6BAA6B,CAAC;AA6CrC,wBAAgB,wCAAwC,CACtD,UAAU,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,EAC5C,MAAM,EAAE,sBAAsB,QAgB/B;AA6UD,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,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;IAwBhC,GAAG;;;;;YAKK,aAAa;YAgHb,4BAA4B;YAkB5B,0BAA0B;YAY1B,8BAA8B;YAK9B,+BAA+B;YAqD/B,gCAAgC;YAmDhC,8BAA8B;IAkC5C,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;IAS1C,OAAO,CAAC,8BAA8B;YAMxB,iCAAiC;YAOjC,iCAAiC;YAkBjC,iCAAiC;IAM/C,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,4BAA4B;IAIpC,OAAO,CAAC,mCAAmC;IAY3C,OAAO,CAAC,2BAA2B;IAsBnC,OAAO,CAAC,yBAAyB;IAiBjC,OAAO,CAAC,wBAAwB;YAkBlB,iCAAiC;YAmCjC,+BAA+B;IA6E7C,OAAO,CAAC,sCAAsC;IA0C9C,OAAO,CAAC,6BAA6B;YAMvB,8BAA8B;YA8C9B,kCAAkC;IA4BhD,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,yBAAyB;IAc3B,6BAA6B;YAgCrB,+BAA+B;IAkD7C,OAAO,CAAC,6BAA6B;IAkCrC,OAAO,CAAC,8BAA8B;YA8CxB,uBAAuB;YAiCvB,6BAA6B;YAa7B,uBAAuB;YA6CvB,8BAA8B;YA8D9B,6BAA6B;IAuE3C,OAAO,CAAC,mCAAmC;YAI7B,0BAA0B;IAaxC,OAAO,CAAC,4BAA4B;IAyGpC,OAAO,CAAC,6BAA6B;YAcvB,uCAAuC;YA0JvC,gCAAgC;YAehC,yBAAyB;YAQzB,8BAA8B;IAQ5C,OAAO,CAAC,0BAA0B;YAkBpB,mCAAmC;YAWnC,qCAAqC;YAgDrC,yBAAyB;YA8DzB,8BAA8B;IAU5C,OAAO,CAAC,kCAAkC;YAQ5B,cAAc;YAuCd,6BAA6B;YAW7B,0BAA0B;YAS1B,6BAA6B;YAmB7B,gBAAgB;IAiB9B,OAAO,CAAC,qBAAqB;CAM9B"}
package/dist/index.d.ts CHANGED
@@ -1545,7 +1545,7 @@ type CheckAllFirmwareReleaseParams = {
1545
1545
  };
1546
1546
  declare function checkAllFirmwareRelease(connectId?: string, params?: CommonParams & CheckAllFirmwareReleaseParams): Response<AllFirmwareRelease>;
1547
1547
 
1548
- type CheckBootloaderReleaseResponse = FirmwareReleaseCheckResult;
1548
+ type CheckBootloaderReleaseResponse = FirmwareReleaseCheckResult | null;
1549
1549
  type CheckBootloaderReleaseParams = {
1550
1550
  willUpdateFirmwareVersion?: string;
1551
1551
  firmwareType?: EFirmwareType;
@@ -1622,9 +1622,9 @@ declare function openWalletSession(connectId: string, params: CommonParams & Ope
1622
1622
  type CheckFirmwareReleaseParams = {
1623
1623
  firmwareType?: EFirmwareType;
1624
1624
  };
1625
- declare function checkFirmwareRelease(connectId?: string, params?: CheckFirmwareReleaseParams): Response<FirmwareReleaseCheckResult>;
1625
+ declare function checkFirmwareRelease(connectId?: string, params?: CheckFirmwareReleaseParams): Response<FirmwareReleaseCheckResult | null>;
1626
1626
 
1627
- declare function checkBLEFirmwareRelease(connectId?: string): Response<FirmwareReleaseCheckResult>;
1627
+ declare function checkBLEFirmwareRelease(connectId?: string): Response<FirmwareReleaseCheckResult | null>;
1628
1628
 
1629
1629
  interface FirmwareUpdateCapabilities {
1630
1630
  planSchemaVersion: 2;
package/dist/index.js CHANGED
@@ -47750,6 +47750,8 @@ class CheckFirmwareRelease extends BaseMethod {
47750
47750
  var _a;
47751
47751
  return __awaiter(this, void 0, void 0, function* () {
47752
47752
  const payload = this.payload;
47753
+ if (!this.device.features)
47754
+ return null;
47753
47755
  if (this.device.isProtocolV2()) {
47754
47756
  const { state, firmwareType, release } = yield loadProtocolV2FirmwareReleaseContext({
47755
47757
  device: this.device,
@@ -47764,13 +47766,10 @@ class CheckFirmwareRelease extends BaseMethod {
47764
47766
  }), PROTOCOL_V2_MAIN_FIRMWARE_TARGETS);
47765
47767
  return toProtocolV2FirmwareReleaseInfo({ plan, state, release });
47766
47768
  }
47767
- if (this.device.features) {
47768
- const deviceFirmwareType = this.device.getCurrentFirmwareType();
47769
- const firmwareType = (_a = payload.firmwareType) !== null && _a !== void 0 ? _a : deviceFirmwareType;
47770
- const releaseInfo = getFirmwareReleaseInfo(this.device.features, firmwareType);
47771
- return releaseInfo;
47772
- }
47773
- throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, 'checkFirmwareRelease requires initialized device features');
47769
+ const deviceFirmwareType = this.device.getCurrentFirmwareType();
47770
+ const firmwareType = (_a = payload.firmwareType) !== null && _a !== void 0 ? _a : deviceFirmwareType;
47771
+ const releaseInfo = getFirmwareReleaseInfo(this.device.features, firmwareType);
47772
+ return releaseInfo;
47774
47773
  });
47775
47774
  }
47776
47775
  }
@@ -47790,6 +47789,8 @@ class CheckBLEFirmwareRelease extends BaseMethod {
47790
47789
  }
47791
47790
  run() {
47792
47791
  return __awaiter(this, void 0, void 0, function* () {
47792
+ if (!this.device.features)
47793
+ return null;
47793
47794
  if (this.device.isProtocolV2()) {
47794
47795
  const { state, firmwareType, release } = yield loadProtocolV2FirmwareReleaseContext({
47795
47796
  device: this.device,
@@ -47807,11 +47808,8 @@ class CheckBLEFirmwareRelease extends BaseMethod {
47807
47808
  release: getProtocolV2ComponentReleaseInfo(plan, 'COPROCESSOR'),
47808
47809
  });
47809
47810
  }
47810
- if (this.device.features) {
47811
- const releaseInfo = getBleFirmwareReleaseInfo(this.device.features);
47812
- return releaseInfo;
47813
- }
47814
- throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, 'checkBLEFirmwareRelease requires initialized device features');
47811
+ const releaseInfo = getBleFirmwareReleaseInfo(this.device.features);
47812
+ return releaseInfo;
47815
47813
  });
47816
47814
  }
47817
47815
  }
@@ -47882,9 +47880,8 @@ class CheckBootloaderRelease extends BaseMethod {
47882
47880
  run() {
47883
47881
  var _a;
47884
47882
  return __awaiter(this, void 0, void 0, function* () {
47885
- if (!this.device.features) {
47886
- throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, 'checkBootloaderRelease requires initialized device features');
47887
- }
47883
+ if (!this.device.features)
47884
+ return null;
47888
47885
  const { features } = this.device;
47889
47886
  const payload = this.payload;
47890
47887
  if (this.device.isProtocolV2()) {
@@ -51536,7 +51533,7 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
51536
51533
  });
51537
51534
  }
51538
51535
  runProtocolV2() {
51539
- var _a, _b, _c, _d, _e;
51536
+ var _a, _b, _c, _d, _e, _f;
51540
51537
  return __awaiter(this, void 0, void 0, function* () {
51541
51538
  yield this.captureProtocolV2PhysicalIdentity();
51542
51539
  const deviceFeatures = yield this.getProtocolV2DeviceFeatures();
@@ -51564,7 +51561,14 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
51564
51561
  resourceBundles = this.prepareExplicitProtocolV2ResourceFiles();
51565
51562
  fwBinaryMap = this.collectExplicitTargetBinaries();
51566
51563
  bootloaderBinary = this.prepareBootloaderBinary();
51567
- const needsRemoteFirmware = !this.hasExplicitProtocolV2Payload(fwBinaryMap);
51564
+ const explicitInstallItems = this.buildProtocolV2InstallItems({
51565
+ bootloaderBinary,
51566
+ fwBinaryMap,
51567
+ });
51568
+ const missingFirmwareTargets = this.getMissingProtocolV2FirmwareTargets(explicitInstallItems);
51569
+ const needsRemoteFirmware = ((_e = this.params.targetsToUpdate) === null || _e === void 0 ? void 0 : _e.length)
51570
+ ? missingFirmwareTargets.length > 0
51571
+ : !this.hasExplicitProtocolV2Payload(explicitInstallItems);
51568
51572
  if (needsPreparedResources) {
51569
51573
  throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, 'Protocol V2 resource manifest must be prepared by the external firmware host', {
51570
51574
  firmwareUpdateCode: 'FirmwareArtifactsNotPrepared',
@@ -51581,7 +51585,7 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
51581
51585
  yield DataManager.forceReloadData();
51582
51586
  }
51583
51587
  if (needsRemoteFirmware) {
51584
- const remoteBinaries = yield this.prepareRemoteProtocolV2Binaries(firmwareType, deviceFeatures);
51588
+ const remoteBinaries = yield this.prepareRemoteProtocolV2Binaries(firmwareType, deviceFeatures, explicitInstallItems);
51585
51589
  bootloaderBinary = remoteBinaries.bootloaderBinary;
51586
51590
  fwBinaryMap = remoteBinaries.fwBinaryMap;
51587
51591
  installItems = remoteBinaries.installItems;
@@ -51592,7 +51596,7 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
51592
51596
  if (typeof err === 'object' &&
51593
51597
  err !== null &&
51594
51598
  'params' in err &&
51595
- ((_e = err.params) === null || _e === void 0 ? void 0 : _e.firmwareUpdateCode) === 'FirmwareArtifactsNotPrepared') {
51599
+ ((_f = err.params) === null || _f === void 0 ? void 0 : _f.firmwareUpdateCode) === 'FirmwareArtifactsNotPrepared') {
51596
51600
  throw err;
51597
51601
  }
51598
51602
  if (err instanceof hdShared.HardwareError && err.errorCode === hdShared.HardwareErrorCode.NetworkError) {
@@ -51907,11 +51911,17 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
51907
51911
  var _a;
51908
51912
  return (_a = this.params.bootloaderBinary) !== null && _a !== void 0 ? _a : null;
51909
51913
  }
51910
- hasExplicitProtocolV2Payload(fwBinaryMap) {
51914
+ hasExplicitProtocolV2Payload(installItems) {
51915
+ var _a;
51916
+ return !!((_a = this.params.resourceFiles) === null || _a === void 0 ? void 0 : _a.length) || installItems.length > 0;
51917
+ }
51918
+ getMissingProtocolV2FirmwareTargets(installItems) {
51911
51919
  var _a;
51912
- return (!!((_a = this.params.resourceFiles) === null || _a === void 0 ? void 0 : _a.length) ||
51913
- !!this.params.bootloaderBinary ||
51914
- fwBinaryMap.length > 0);
51920
+ const preparedTargets = new Set(installItems.flatMap(item => {
51921
+ const target = PROTOCOL_V2_UPDATE_TARGET_BY_TARGET_ID.get(item.targetId);
51922
+ return target ? [target] : [];
51923
+ }));
51924
+ return ((_a = this.params.targetsToUpdate) !== null && _a !== void 0 ? _a : []).filter(target => target !== 'resource' && !preparedTargets.has(target));
51915
51925
  }
51916
51926
  buildProtocolV2InstallItems({ bootloaderBinary, fwBinaryMap, }) {
51917
51927
  const installItems = [];
@@ -51974,7 +51984,7 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
51974
51984
  return Object.assign(Object.assign({}, target), { binary });
51975
51985
  });
51976
51986
  }
51977
- prepareRemoteProtocolV2Binaries(firmwareType, features) {
51987
+ prepareRemoteProtocolV2Binaries(firmwareType, features, explicitInstallItems = []) {
51978
51988
  var _a, _b;
51979
51989
  return __awaiter(this, void 0, void 0, function* () {
51980
51990
  const release = DataManager.getFirmwareLatestRelease(features, firmwareType);
@@ -51982,6 +51992,10 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
51982
51992
  const fwBinaryMap = [];
51983
51993
  const installItems = [];
51984
51994
  if (!release) {
51995
+ const missingFirmwareTargets = this.getMissingProtocolV2FirmwareTargets(explicitInstallItems);
51996
+ if (missingFirmwareTargets.length > 0) {
51997
+ throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, `Protocol V2 firmware release is unavailable for requested targets: ${missingFirmwareTargets.join(', ')}`);
51998
+ }
51985
51999
  return {
51986
52000
  bootloaderBinary,
51987
52001
  fwBinaryMap,
@@ -51990,6 +52004,8 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
51990
52004
  }
51991
52005
  const entries = this.getRemoteComponentEntries(release);
51992
52006
  const targetsToUpdate = new Set((_a = this.params.targetsToUpdate) !== null && _a !== void 0 ? _a : []);
52007
+ const explicitInstallItemByTargetId = new Map(explicitInstallItems.map(item => [item.targetId, item]));
52008
+ const preparedTargets = new Set();
51993
52009
  for (const [key, component] of entries) {
51994
52010
  const targetName = (_b = component.target) === null || _b === void 0 ? void 0 : _b.toUpperCase();
51995
52011
  const target = PROTOCOL_V2_REMOTE_COMPONENT_TARGETS[targetName];
@@ -51997,27 +52013,27 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
51997
52013
  ? PROTOCOL_V2_UPDATE_TARGET_BY_TARGET_ID.get(target.targetId)
51998
52014
  : undefined;
51999
52015
  if (updateTarget && targetsToUpdate.has(updateTarget)) {
52000
- const remoteBinary = yield this.downloadRemoteProtocolV2Component(key, component);
52001
- if (remoteBinary.kind === 'bootloader') {
52002
- bootloaderBinary = remoteBinary.binary;
52003
- installItems.push({
52004
- fileName: remoteBinary.fileName,
52005
- binary: remoteBinary.binary,
52006
- targetId: remoteBinary.targetId,
52007
- kind: remoteBinary.kind,
52008
- });
52016
+ const explicitInstallItem = explicitInstallItemByTargetId.get(target.targetId);
52017
+ const installItem = explicitInstallItem !== null && explicitInstallItem !== void 0 ? explicitInstallItem : (yield this.downloadRemoteProtocolV2Component(key, component));
52018
+ if (installItem.kind === 'bootloader') {
52019
+ bootloaderBinary = installItem.binary;
52009
52020
  }
52010
52021
  else {
52011
52022
  const binaryEntry = {
52012
- fileName: remoteBinary.fileName,
52013
- binary: remoteBinary.binary,
52014
- targetId: remoteBinary.targetId,
52023
+ fileName: installItem.fileName,
52024
+ binary: installItem.binary,
52025
+ targetId: installItem.targetId,
52015
52026
  };
52016
52027
  fwBinaryMap.push(binaryEntry);
52017
- installItems.push(Object.assign(Object.assign({}, binaryEntry), { kind: remoteBinary.kind }));
52018
52028
  }
52029
+ installItems.push(Object.assign({}, installItem));
52030
+ preparedTargets.add(updateTarget);
52019
52031
  }
52020
52032
  }
52033
+ const missingTarget = Array.from(targetsToUpdate).find(target => target !== 'resource' && !preparedTargets.has(target));
52034
+ if (missingTarget) {
52035
+ throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, `Protocol V2 release does not contain requested target ${missingTarget}`);
52036
+ }
52021
52037
  return {
52022
52038
  bootloaderBinary,
52023
52039
  fwBinaryMap,
@@ -1,4 +1,4 @@
1
1
  import type { Response } from '../params';
2
2
  import type { FirmwareReleaseCheckResult } from './checkAllFirmwareRelease';
3
- export declare function checkBLEFirmwareRelease(connectId?: string): Response<FirmwareReleaseCheckResult>;
3
+ export declare function checkBLEFirmwareRelease(connectId?: string): Response<FirmwareReleaseCheckResult | null>;
4
4
  //# sourceMappingURL=checkBLEFirmwareRelease.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkBLEFirmwareRelease.d.ts","sourceRoot":"","sources":["../../../src/types/api/checkBLEFirmwareRelease.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAE5E,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAC7C,SAAS,CAAC,EAAE,MAAM,GACjB,QAAQ,CAAC,0BAA0B,CAAC,CAAC"}
1
+ {"version":3,"file":"checkBLEFirmwareRelease.d.ts","sourceRoot":"","sources":["../../../src/types/api/checkBLEFirmwareRelease.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAE5E,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAC7C,SAAS,CAAC,EAAE,MAAM,GACjB,QAAQ,CAAC,0BAA0B,GAAG,IAAI,CAAC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import type { EFirmwareType } from '@onekeyfe/hd-shared';
2
2
  import type { CommonParams, Response } from '../params';
3
3
  import type { FirmwareReleaseCheckResult } from './checkAllFirmwareRelease';
4
- export type CheckBootloaderReleaseResponse = FirmwareReleaseCheckResult;
4
+ export type CheckBootloaderReleaseResponse = FirmwareReleaseCheckResult | null;
5
5
  export type CheckBootloaderReleaseParams = {
6
6
  willUpdateFirmwareVersion?: string;
7
7
  firmwareType?: EFirmwareType;
@@ -1 +1 @@
1
- {"version":3,"file":"checkBootloaderRelease.d.ts","sourceRoot":"","sources":["../../../src/types/api/checkBootloaderRelease.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAE5E,MAAM,MAAM,8BAA8B,GAAG,0BAA0B,CAAC;AAExE,MAAM,MAAM,4BAA4B,GAAG;IACzC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,YAAY,CAAC,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAC5C,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,YAAY,GAAG,4BAA4B,GACnD,QAAQ,CAAC,8BAA8B,CAAC,CAAC"}
1
+ {"version":3,"file":"checkBootloaderRelease.d.ts","sourceRoot":"","sources":["../../../src/types/api/checkBootloaderRelease.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAE5E,MAAM,MAAM,8BAA8B,GAAG,0BAA0B,GAAG,IAAI,CAAC;AAE/E,MAAM,MAAM,4BAA4B,GAAG;IACzC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,YAAY,CAAC,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAC5C,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,YAAY,GAAG,4BAA4B,GACnD,QAAQ,CAAC,8BAA8B,CAAC,CAAC"}
@@ -4,5 +4,5 @@ import type { FirmwareReleaseCheckResult } from './checkAllFirmwareRelease';
4
4
  export type CheckFirmwareReleaseParams = {
5
5
  firmwareType?: EFirmwareType;
6
6
  };
7
- export declare function checkFirmwareRelease(connectId?: string, params?: CheckFirmwareReleaseParams): Response<FirmwareReleaseCheckResult>;
7
+ export declare function checkFirmwareRelease(connectId?: string, params?: CheckFirmwareReleaseParams): Response<FirmwareReleaseCheckResult | null>;
8
8
  //# sourceMappingURL=checkFirmwareRelease.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkFirmwareRelease.d.ts","sourceRoot":"","sources":["../../../src/types/api/checkFirmwareRelease.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAE5E,MAAM,MAAM,0BAA0B,GAAG;IACvC,YAAY,CAAC,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAC1C,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,0BAA0B,GAClC,QAAQ,CAAC,0BAA0B,CAAC,CAAC"}
1
+ {"version":3,"file":"checkFirmwareRelease.d.ts","sourceRoot":"","sources":["../../../src/types/api/checkFirmwareRelease.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAE5E,MAAM,MAAM,0BAA0B,GAAG;IACvC,YAAY,CAAC,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAC1C,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,0BAA0B,GAClC,QAAQ,CAAC,0BAA0B,GAAG,IAAI,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onekeyfe/hd-core",
3
- "version": "1.2.0-alpha.80",
3
+ "version": "1.2.0-alpha.82",
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.80",
29
- "@onekeyfe/hd-transport": "1.2.0-alpha.80",
28
+ "@onekeyfe/hd-shared": "1.2.0-alpha.82",
29
+ "@onekeyfe/hd-transport": "1.2.0-alpha.82",
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": "7a1fda70653fc04493307cfaae76c04cc5cd1554"
47
+ "gitHead": "7b2b6f5b2f046f5ff2e35e14735ba3918c258054"
48
48
  }
@@ -1,5 +1,3 @@
1
- import { ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
2
-
3
1
  import { BaseMethod } from './BaseMethod';
4
2
  import { UI_REQUEST } from '../constants/ui-request';
5
3
  import { getBleFirmwareReleaseInfo } from './firmware/releaseHelper';
@@ -28,6 +26,8 @@ export default class CheckBLEFirmwareRelease extends BaseMethod {
28
26
  }
29
27
 
30
28
  async run() {
29
+ if (!this.device.features) return null;
30
+
31
31
  if (this.device.isProtocolV2()) {
32
32
  const { state, firmwareType, release } = await loadProtocolV2FirmwareReleaseContext({
33
33
  device: this.device,
@@ -49,13 +49,7 @@ export default class CheckBLEFirmwareRelease extends BaseMethod {
49
49
  });
50
50
  }
51
51
 
52
- if (this.device.features) {
53
- const releaseInfo = getBleFirmwareReleaseInfo(this.device.features);
54
- return releaseInfo;
55
- }
56
- throw ERRORS.TypedError(
57
- HardwareErrorCode.RuntimeError,
58
- 'checkBLEFirmwareRelease requires initialized device features'
59
- );
52
+ const releaseInfo = getBleFirmwareReleaseInfo(this.device.features);
53
+ return releaseInfo;
60
54
  }
61
55
  }
@@ -1,5 +1,3 @@
1
- import { ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
2
-
3
1
  import { BaseMethod } from './BaseMethod';
4
2
  import { UI_REQUEST } from '../constants/ui-request';
5
3
  import { getBootloaderReleaseInfo } from './firmware/releaseHelper';
@@ -26,12 +24,7 @@ export default class CheckBootloaderRelease extends BaseMethod {
26
24
  }
27
25
 
28
26
  async run() {
29
- if (!this.device.features) {
30
- throw ERRORS.TypedError(
31
- HardwareErrorCode.RuntimeError,
32
- 'checkBootloaderRelease requires initialized device features'
33
- );
34
- }
27
+ if (!this.device.features) return null;
35
28
  const { features } = this.device;
36
29
  const payload = this.payload as CheckBootloaderReleaseParams;
37
30
 
@@ -1,5 +1,3 @@
1
- import { ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
2
-
3
1
  import { BaseMethod } from './BaseMethod';
4
2
  import { UI_REQUEST } from '../constants/ui-request';
5
3
  import { getFirmwareReleaseInfo } from './firmware/releaseHelper';
@@ -31,6 +29,8 @@ export default class CheckFirmwareRelease extends BaseMethod {
31
29
  async run() {
32
30
  const payload = this.payload as CheckFirmwareReleaseParams;
33
31
 
32
+ if (!this.device.features) return null;
33
+
34
34
  if (this.device.isProtocolV2()) {
35
35
  const { state, firmwareType, release } = await loadProtocolV2FirmwareReleaseContext({
36
36
  device: this.device,
@@ -49,16 +49,10 @@ export default class CheckFirmwareRelease extends BaseMethod {
49
49
  return toProtocolV2FirmwareReleaseInfo({ plan, state, release });
50
50
  }
51
51
 
52
- if (this.device.features) {
53
- const deviceFirmwareType = this.device.getCurrentFirmwareType();
54
- const firmwareType = payload.firmwareType ?? deviceFirmwareType;
52
+ const deviceFirmwareType = this.device.getCurrentFirmwareType();
53
+ const firmwareType = payload.firmwareType ?? deviceFirmwareType;
55
54
 
56
- const releaseInfo = getFirmwareReleaseInfo(this.device.features, firmwareType);
57
- return releaseInfo;
58
- }
59
- throw ERRORS.TypedError(
60
- HardwareErrorCode.RuntimeError,
61
- 'checkFirmwareRelease requires initialized device features'
62
- );
55
+ const releaseInfo = getFirmwareReleaseInfo(this.device.features, firmwareType);
56
+ return releaseInfo;
63
57
  }
64
58
  }
@@ -683,7 +683,14 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
683
683
  resourceBundles = this.prepareExplicitProtocolV2ResourceFiles();
684
684
  fwBinaryMap = this.collectExplicitTargetBinaries();
685
685
  bootloaderBinary = this.prepareBootloaderBinary();
686
- const needsRemoteFirmware = !this.hasExplicitProtocolV2Payload(fwBinaryMap);
686
+ const explicitInstallItems = this.buildProtocolV2InstallItems({
687
+ bootloaderBinary,
688
+ fwBinaryMap,
689
+ });
690
+ const missingFirmwareTargets = this.getMissingProtocolV2FirmwareTargets(explicitInstallItems);
691
+ const needsRemoteFirmware = this.params.targetsToUpdate?.length
692
+ ? missingFirmwareTargets.length > 0
693
+ : !this.hasExplicitProtocolV2Payload(explicitInstallItems);
687
694
  if (needsPreparedResources) {
688
695
  throw ERRORS.TypedError(
689
696
  HardwareErrorCode.RuntimeError,
@@ -713,7 +720,8 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
713
720
  if (needsRemoteFirmware) {
714
721
  const remoteBinaries = await this.prepareRemoteProtocolV2Binaries(
715
722
  firmwareType,
716
- deviceFeatures
723
+ deviceFeatures,
724
+ explicitInstallItems
717
725
  );
718
726
  bootloaderBinary = remoteBinaries.bootloaderBinary;
719
727
  fwBinaryMap = remoteBinaries.fwBinaryMap;
@@ -1110,11 +1118,19 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
1110
1118
  return this.params.bootloaderBinary ?? null;
1111
1119
  }
1112
1120
 
1113
- private hasExplicitProtocolV2Payload(fwBinaryMap: ProtocolV2TargetBinary[]) {
1114
- return (
1115
- !!this.params.resourceFiles?.length ||
1116
- !!this.params.bootloaderBinary ||
1117
- fwBinaryMap.length > 0
1121
+ private hasExplicitProtocolV2Payload(installItems: ProtocolV2InstallItem[]) {
1122
+ return !!this.params.resourceFiles?.length || installItems.length > 0;
1123
+ }
1124
+
1125
+ private getMissingProtocolV2FirmwareTargets(installItems: ProtocolV2InstallItem[]) {
1126
+ const preparedTargets = new Set(
1127
+ installItems.flatMap(item => {
1128
+ const target = PROTOCOL_V2_UPDATE_TARGET_BY_TARGET_ID.get(item.targetId);
1129
+ return target ? [target] : [];
1130
+ })
1131
+ );
1132
+ return (this.params.targetsToUpdate ?? []).filter(
1133
+ target => target !== 'resource' && !preparedTargets.has(target)
1118
1134
  );
1119
1135
  }
1120
1136
 
@@ -1210,7 +1226,11 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
1210
1226
  };
1211
1227
  }
1212
1228
 
1213
- private async prepareRemoteProtocolV2Binaries(firmwareType: EFirmwareType, features: Features) {
1229
+ private async prepareRemoteProtocolV2Binaries(
1230
+ firmwareType: EFirmwareType,
1231
+ features: Features,
1232
+ explicitInstallItems: ProtocolV2InstallItem[] = []
1233
+ ) {
1214
1234
  const release = DataManager.getFirmwareLatestRelease(features, firmwareType);
1215
1235
 
1216
1236
  let bootloaderBinary: ArrayBuffer | null = null;
@@ -1218,6 +1238,15 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
1218
1238
  const installItems: ProtocolV2InstallItem[] = [];
1219
1239
 
1220
1240
  if (!release) {
1241
+ const missingFirmwareTargets = this.getMissingProtocolV2FirmwareTargets(explicitInstallItems);
1242
+ if (missingFirmwareTargets.length > 0) {
1243
+ throw ERRORS.TypedError(
1244
+ HardwareErrorCode.RuntimeError,
1245
+ `Protocol V2 firmware release is unavailable for requested targets: ${missingFirmwareTargets.join(
1246
+ ', '
1247
+ )}`
1248
+ );
1249
+ }
1221
1250
  return {
1222
1251
  bootloaderBinary,
1223
1252
  fwBinaryMap,
@@ -1227,6 +1256,10 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
1227
1256
 
1228
1257
  const entries = this.getRemoteComponentEntries(release);
1229
1258
  const targetsToUpdate = new Set(this.params.targetsToUpdate ?? []);
1259
+ const explicitInstallItemByTargetId = new Map(
1260
+ explicitInstallItems.map(item => [item.targetId, item] as const)
1261
+ );
1262
+ const preparedTargets = new Set<FirmwareUpdateV4Target>();
1230
1263
 
1231
1264
  for (const [key, component] of entries) {
1232
1265
  const targetName = component.target?.toUpperCase();
@@ -1235,27 +1268,34 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
1235
1268
  ? PROTOCOL_V2_UPDATE_TARGET_BY_TARGET_ID.get(target.targetId)
1236
1269
  : undefined;
1237
1270
  if (updateTarget && targetsToUpdate.has(updateTarget)) {
1238
- const remoteBinary = await this.downloadRemoteProtocolV2Component(key, component);
1239
- if (remoteBinary.kind === 'bootloader') {
1240
- bootloaderBinary = remoteBinary.binary;
1241
- installItems.push({
1242
- fileName: remoteBinary.fileName,
1243
- binary: remoteBinary.binary,
1244
- targetId: remoteBinary.targetId,
1245
- kind: remoteBinary.kind,
1246
- });
1271
+ const explicitInstallItem = explicitInstallItemByTargetId.get(target.targetId);
1272
+ const installItem =
1273
+ explicitInstallItem ?? (await this.downloadRemoteProtocolV2Component(key, component));
1274
+ if (installItem.kind === 'bootloader') {
1275
+ bootloaderBinary = installItem.binary;
1247
1276
  } else {
1248
1277
  const binaryEntry = {
1249
- fileName: remoteBinary.fileName,
1250
- binary: remoteBinary.binary,
1251
- targetId: remoteBinary.targetId,
1278
+ fileName: installItem.fileName,
1279
+ binary: installItem.binary,
1280
+ targetId: installItem.targetId,
1252
1281
  };
1253
1282
  fwBinaryMap.push(binaryEntry);
1254
- installItems.push({ ...binaryEntry, kind: remoteBinary.kind });
1255
1283
  }
1284
+ installItems.push({ ...installItem });
1285
+ preparedTargets.add(updateTarget);
1256
1286
  }
1257
1287
  }
1258
1288
 
1289
+ const missingTarget = Array.from(targetsToUpdate).find(
1290
+ target => target !== 'resource' && !preparedTargets.has(target)
1291
+ );
1292
+ if (missingTarget) {
1293
+ throw ERRORS.TypedError(
1294
+ HardwareErrorCode.RuntimeError,
1295
+ `Protocol V2 release does not contain requested target ${missingTarget}`
1296
+ );
1297
+ }
1298
+
1259
1299
  return {
1260
1300
  bootloaderBinary,
1261
1301
  fwBinaryMap,
@@ -3,4 +3,4 @@ import type { FirmwareReleaseCheckResult } from './checkAllFirmwareRelease';
3
3
 
4
4
  export declare function checkBLEFirmwareRelease(
5
5
  connectId?: string
6
- ): Response<FirmwareReleaseCheckResult>;
6
+ ): Response<FirmwareReleaseCheckResult | null>;
@@ -2,7 +2,7 @@ import type { EFirmwareType } from '@onekeyfe/hd-shared';
2
2
  import type { CommonParams, Response } from '../params';
3
3
  import type { FirmwareReleaseCheckResult } from './checkAllFirmwareRelease';
4
4
 
5
- export type CheckBootloaderReleaseResponse = FirmwareReleaseCheckResult;
5
+ export type CheckBootloaderReleaseResponse = FirmwareReleaseCheckResult | null;
6
6
 
7
7
  export type CheckBootloaderReleaseParams = {
8
8
  willUpdateFirmwareVersion?: string;
@@ -9,4 +9,4 @@ export type CheckFirmwareReleaseParams = {
9
9
  export declare function checkFirmwareRelease(
10
10
  connectId?: string,
11
11
  params?: CheckFirmwareReleaseParams
12
- ): Response<FirmwareReleaseCheckResult>;
12
+ ): Response<FirmwareReleaseCheckResult | null>;