@onekeyfe/hd-core 1.2.0-alpha.97 → 1.2.0-alpha.99

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.
Files changed (103) hide show
  1. package/__tests__/check-all-firmware-release-protocol-v2.test.ts +411 -86
  2. package/__tests__/check-firmware-release-protocol-v2.test.ts +199 -0
  3. package/__tests__/firmware-memory-host.test.ts +126 -0
  4. package/__tests__/firmware-update/device-update-bootloader.test.ts +14 -2
  5. package/__tests__/firmware-update/firmware-host-binding.test.ts +9 -0
  6. package/__tests__/firmware-update/firmware-prepared-host-digest.test.ts +573 -0
  7. package/__tests__/firmware-update/firmware-prepared-resource-archive.test.ts +150 -0
  8. package/__tests__/firmware-update/firmware-update-bootloader-poll.test.ts +65 -2
  9. package/__tests__/firmware-update/firmware-update-plan-bootloader-identity.test.ts +80 -0
  10. package/__tests__/firmware-update/firmware-update-plan.test.ts +293 -71
  11. package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +53 -1
  12. package/__tests__/firmware-update/firmware-update-prepared-resource-executors.test.ts +326 -0
  13. package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +2 -2
  14. package/__tests__/protocol-v2-firmware-targets.test.ts +16 -0
  15. package/__tests__/protocol-v2-resources.test.ts +148 -232
  16. package/__tests__/protocol-v2.test.ts +1326 -510
  17. package/dist/api/CheckAllFirmwareRelease.d.ts +2 -3
  18. package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
  19. package/dist/api/CheckBLEFirmwareRelease.d.ts +3 -2
  20. package/dist/api/CheckBLEFirmwareRelease.d.ts.map +1 -1
  21. package/dist/api/CheckBootloaderRelease.d.ts +2 -1
  22. package/dist/api/CheckBootloaderRelease.d.ts.map +1 -1
  23. package/dist/api/CheckFirmwareRelease.d.ts +3 -2
  24. package/dist/api/CheckFirmwareRelease.d.ts.map +1 -1
  25. package/dist/api/FirmwareUpdateV2.d.ts +1 -0
  26. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  27. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  28. package/dist/api/FirmwareUpdateV4.d.ts +11 -9
  29. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  30. package/dist/api/UploadPortfolio.d.ts.map +1 -1
  31. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  32. package/dist/api/firmware/FirmwareHostBinding.d.ts +1 -1
  33. package/dist/api/firmware/FirmwareHostBinding.d.ts.map +1 -1
  34. package/dist/api/firmware/FirmwareMemoryHost.d.ts +22 -0
  35. package/dist/api/firmware/FirmwareMemoryHost.d.ts.map +1 -0
  36. package/dist/api/firmware/FirmwarePreparedResourceArchive.d.ts +11 -0
  37. package/dist/api/firmware/FirmwarePreparedResourceArchive.d.ts.map +1 -0
  38. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
  39. package/dist/api/firmware/FirmwareUpdatePlan.d.ts +48 -1
  40. package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +1 -1
  41. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts +7 -1
  42. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +1 -1
  43. package/dist/api/firmware/getBinary.d.ts +0 -1
  44. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  45. package/dist/api/firmware/protocolV2Release.d.ts +33 -0
  46. package/dist/api/firmware/protocolV2Release.d.ts.map +1 -0
  47. package/dist/data-manager/DataManager.d.ts +4 -3
  48. package/dist/data-manager/DataManager.d.ts.map +1 -1
  49. package/dist/index.d.ts +108 -114
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +1825 -1006
  52. package/dist/protocols/protocol-v2/resources.d.ts +10 -28
  53. package/dist/protocols/protocol-v2/resources.d.ts.map +1 -1
  54. package/dist/types/api/checkAllFirmwareRelease.d.ts +20 -8
  55. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  56. package/dist/types/api/checkBLEFirmwareRelease.d.ts +2 -13
  57. package/dist/types/api/checkBLEFirmwareRelease.d.ts.map +1 -1
  58. package/dist/types/api/checkBootloaderRelease.d.ts +2 -6
  59. package/dist/types/api/checkBootloaderRelease.d.ts.map +1 -1
  60. package/dist/types/api/checkFirmwareRelease.d.ts +2 -13
  61. package/dist/types/api/checkFirmwareRelease.d.ts.map +1 -1
  62. package/dist/types/api/checkFirmwareTypeAvailable.d.ts +2 -2
  63. package/dist/types/api/checkFirmwareTypeAvailable.d.ts.map +1 -1
  64. package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
  65. package/dist/types/api/export.d.ts +1 -1
  66. package/dist/types/api/export.d.ts.map +1 -1
  67. package/dist/types/api/firmwareUpdate.d.ts +4 -12
  68. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  69. package/dist/types/api/firmwareUpdatePlan.d.ts +2 -2
  70. package/dist/types/api/firmwareUpdatePlan.d.ts.map +1 -1
  71. package/dist/types/settings.d.ts +35 -36
  72. package/dist/types/settings.d.ts.map +1 -1
  73. package/package.json +4 -4
  74. package/src/api/CheckAllFirmwareRelease.ts +113 -80
  75. package/src/api/CheckBLEFirmwareRelease.ts +37 -5
  76. package/src/api/CheckBootloaderRelease.ts +35 -3
  77. package/src/api/CheckFirmwareRelease.ts +35 -7
  78. package/src/api/FirmwareUpdateV2.ts +231 -138
  79. package/src/api/FirmwareUpdateV3.ts +101 -56
  80. package/src/api/FirmwareUpdateV4.ts +936 -408
  81. package/src/api/UploadPortfolio.ts +18 -0
  82. package/src/api/device/DeviceUpdateBootloader.ts +37 -11
  83. package/src/api/firmware/FirmwareHostBinding.ts +26 -3
  84. package/src/api/firmware/FirmwareMemoryHost.ts +143 -0
  85. package/src/api/firmware/FirmwarePreparedResourceArchive.ts +207 -0
  86. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +122 -73
  87. package/src/api/firmware/FirmwareUpdatePlan.ts +295 -122
  88. package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +49 -12
  89. package/src/api/firmware/protocolV2Release.ts +168 -0
  90. package/src/data-manager/DataManager.ts +35 -19
  91. package/src/index.ts +10 -0
  92. package/src/protocols/protocol-v2/resources.ts +157 -341
  93. package/src/types/api/checkAllFirmwareRelease.ts +27 -12
  94. package/src/types/api/checkBLEFirmwareRelease.ts +4 -13
  95. package/src/types/api/checkBootloaderRelease.ts +2 -6
  96. package/src/types/api/checkFirmwareRelease.ts +2 -13
  97. package/src/types/api/checkFirmwareTypeAvailable.ts +2 -2
  98. package/src/types/api/deviceUpdateBootloader.ts +1 -0
  99. package/src/types/api/export.ts +6 -1
  100. package/src/types/api/firmwareUpdate.ts +12 -17
  101. package/src/types/api/firmwareUpdatePlan.ts +2 -2
  102. package/src/types/settings.ts +35 -61
  103. package/src/utils/deviceFeaturesUtils.ts +2 -2
@@ -1,10 +1,4 @@
1
- import {
2
- EDeviceType,
3
- EFirmwareType,
4
- ERRORS,
5
- HardwareError,
6
- HardwareErrorCode,
7
- } from '@onekeyfe/hd-shared';
1
+ import { EDeviceType, HardwareError } from '@onekeyfe/hd-shared';
8
2
  import semver from 'semver';
9
3
 
10
4
  import { BaseMethod } from './BaseMethod';
@@ -17,13 +11,20 @@ import {
17
11
  } from './firmware/releaseHelper';
18
12
  import {
19
13
  buildFirmwareUpdatePlan,
14
+ buildProtocolV2FirmwareUpdatePlan,
20
15
  validateFirmwareUpdatePlanForceTargets,
16
+ validateProtocolV2FirmwareUpdateTargets,
21
17
  } from './firmware/FirmwareUpdatePlan';
22
- import { getBridgeReleaseInfo } from '../utils/bridgeUpdate';
23
18
  import {
24
- buildProtocolV2ResourceUpdatePlan,
25
- readProtocolV2ResourceInventory,
26
- } from '../protocols/protocol-v2/resources';
19
+ PROTOCOL_V2_BLE_TARGETS,
20
+ PROTOCOL_V2_BOOTLOADER_TARGETS,
21
+ PROTOCOL_V2_MAIN_FIRMWARE_TARGETS,
22
+ getProtocolV2ComponentReleaseInfo,
23
+ loadProtocolV2FirmwareReleaseContext,
24
+ summarizeProtocolV2FirmwareRelease,
25
+ toProtocolV2FirmwareReleaseInfo,
26
+ } from './firmware/protocolV2Release';
27
+ import { getBridgeReleaseInfo } from '../utils/bridgeUpdate';
27
28
  import {
28
29
  LoggerNames,
29
30
  getDeviceFirmwareVersion,
@@ -32,6 +33,7 @@ import {
32
33
  getLogger,
33
34
  } from '../utils';
34
35
 
36
+ import type { EFirmwareType } from '@onekeyfe/hd-shared';
35
37
  import type {
36
38
  AllFirmwareRelease,
37
39
  CheckAllFirmwareReleaseParams,
@@ -173,7 +175,7 @@ function buildComponentRelease({
173
175
  };
174
176
  }
175
177
 
176
- type ProtocolV2FirmwareReleasePlan = {
178
+ export type ProtocolV2FirmwareReleasePlan = {
177
179
  firmwareType: EFirmwareType;
178
180
  status: ProtocolV2FirmwareReleaseStatus;
179
181
  hasUpgrade: boolean;
@@ -384,31 +386,23 @@ export default class CheckAllFirmwareRelease extends BaseMethod {
384
386
  }
385
387
 
386
388
  private async runProtocolV2(): Promise<AllFirmwareRelease> {
387
- const { checkFirmwareHash = false, firmwareType: firmwareTypeParam } = this
388
- .payload as CheckAllFirmwareReleaseParams;
389
- const state = await this.device.getDeviceState({
390
- refreshSections: checkFirmwareHash
391
- ? ['identity', 'versions', 'verification']
392
- : ['identity', 'versions'],
389
+ const {
390
+ checkFirmwareHash = false,
391
+ firmwareType: firmwareTypeParam,
392
+ platform,
393
+ forceUpdateTargets,
394
+ protocolV2ForceUpdateTargets,
395
+ } = this.payload as CheckAllFirmwareReleaseParams;
396
+ const validatedForceUpdateTargets = validateFirmwareUpdatePlanForceTargets(forceUpdateTargets);
397
+ const validatedProtocolV2ForceUpdateTargets = validateProtocolV2FirmwareUpdateTargets(
398
+ protocolV2ForceUpdateTargets
399
+ );
400
+ const { state, features, firmwareType, release } = await loadProtocolV2FirmwareReleaseContext({
401
+ device: this.device,
402
+ firmwareType: firmwareTypeParam,
403
+ checkFirmwareHash,
404
+ methodName: 'checkAllFirmwareRelease',
393
405
  });
394
- if (state.identity.deviceType !== 'pro2' && state.identity.deviceType !== 'neo') {
395
- throw ERRORS.TypedError(
396
- HardwareErrorCode.DeviceNotSupportMethod,
397
- 'checkAllFirmwareRelease requires a Pro2 or Neo device for Protocol V2'
398
- );
399
- }
400
-
401
- const { features } = this.device;
402
- if (!features) {
403
- throw ERRORS.TypedError(
404
- HardwareErrorCode.RuntimeError,
405
- 'checkAllFirmwareRelease requires initialized device features'
406
- );
407
- }
408
-
409
- const firmwareType =
410
- firmwareTypeParam ?? state.identity.firmwareType ?? EFirmwareType.Universal;
411
- const release = DataManager.getFirmwareLatestRelease(features, firmwareType);
412
406
  const plan = buildProtocolV2FirmwareRelease({
413
407
  currentVersions: state.versions,
414
408
  currentVerification: checkFirmwareHash ? state.verification : undefined,
@@ -419,60 +413,99 @@ export default class CheckAllFirmwareRelease extends BaseMethod {
419
413
  });
420
414
  const resourceDeviceType =
421
415
  state.identity.deviceType === 'neo' ? EDeviceType.Neo : EDeviceType.Pro2;
422
- const resources = DataManager.getProtocolV2Resources(resourceDeviceType);
423
- let resourceStatus: 'valid' | 'outdated' | 'unknown' = 'unknown';
424
- if (resources?.length) {
425
- const loaderMode = state.status.mode === 'bootloader' || state.status.mode === 'romloader';
426
- // Application mode rejects host access to vol0:/bundles. Resource inventory is
427
- // resolved after FirmwareUpdateV4 enters a loader instead of probing here.
428
- if (loaderMode) {
429
- try {
430
- const inventory = await readProtocolV2ResourceInventory({
431
- commands: this.device.getCommands(),
432
- resources,
433
- });
434
- resourceStatus = buildProtocolV2ResourceUpdatePlan({
435
- resources,
436
- inventory,
437
- mode: 'bootloader-recovery',
438
- }).status;
439
- } catch {
440
- resourceStatus = buildProtocolV2ResourceUpdatePlan({
441
- resources,
442
- mode: 'bootloader-recovery',
443
- }).status;
444
- }
416
+ const resourceSource = DataManager.getProtocolV2ResourceSource(resourceDeviceType);
417
+ const resourceStatus = 'unknown' as const;
418
+ const detectedComponentTargets = validatedForceUpdateTargets.includes('firmware')
419
+ ? plan.components.flatMap(component =>
420
+ component.updateTarget ? [component.updateTarget] : []
421
+ )
422
+ : plan.targetsToUpdate;
423
+ const componentTargetsToUpdate = Array.from(
424
+ new Set([
425
+ ...detectedComponentTargets,
426
+ ...validatedProtocolV2ForceUpdateTargets.filter(target => target !== 'resource'),
427
+ ])
428
+ );
429
+ const forceResourceUpdate =
430
+ validatedForceUpdateTargets.includes('resource') ||
431
+ validatedProtocolV2ForceUpdateTargets.includes('resource');
432
+ // A configured resource archive accompanies a real remote component update,
433
+ // but its mere availability must not turn an otherwise current device into a
434
+ // resource-only update. Explicit developer resource forcing remains supported.
435
+ const includeResourceUpdate =
436
+ forceResourceUpdate || (resourceSource !== undefined && detectedComponentTargets.length > 0);
437
+ const targetsToUpdate = Array.from(
438
+ new Set([
439
+ ...componentTargetsToUpdate,
440
+ ...(includeResourceUpdate ? (['resource'] as const) : []),
441
+ ])
442
+ );
443
+ let firmwareUpdatePlan: FirmwareUpdatePlan | undefined;
444
+ const shouldBuildFirmwareUpdatePlan = targetsToUpdate.length > 0;
445
+ const requestedPlatform = platform ?? 'web';
446
+ const requiresPreparedPlan =
447
+ shouldBuildFirmwareUpdatePlan &&
448
+ (requestedPlatform === 'native' || requestedPlatform === 'desktop');
449
+ try {
450
+ if (shouldBuildFirmwareUpdatePlan) {
451
+ const validatedPlan = buildProtocolV2FirmwareUpdatePlan({
452
+ features,
453
+ firmwareType,
454
+ platform: requestedPlatform,
455
+ release,
456
+ targetsToUpdate,
457
+ forceUpdateTargets: validatedForceUpdateTargets,
458
+ resourceArchive: resourceSource,
459
+ });
460
+ firmwareUpdatePlan = validatedPlan;
461
+ } else {
462
+ firmwareUpdatePlan = undefined;
463
+ }
464
+ } catch (error) {
465
+ if (
466
+ requiresPreparedPlan ||
467
+ validatedForceUpdateTargets.length > 0 ||
468
+ validatedProtocolV2ForceUpdateTargets.length > 0 ||
469
+ !(error instanceof HardwareError) ||
470
+ error.params?.firmwareUpdateCode !== 'FirmwarePlanInvalid'
471
+ ) {
472
+ throw error;
445
473
  }
474
+ Log.warn(
475
+ '[CheckAllFirmwareRelease] Optional Protocol V2 firmware Plan is unavailable; using the release result'
476
+ );
477
+ firmwareUpdatePlan = undefined;
446
478
  }
447
- const targetsToUpdate = [
448
- ...plan.targetsToUpdate,
449
- ...(resourceStatus === 'outdated' ? (['resource'] as const) : []),
450
- ];
451
- const firmwareStatus = plan.status === 'unavailable' ? 'unknown' : plan.status;
452
- const emptyRelease = 'none' as const;
479
+ const firmwarePlan = summarizeProtocolV2FirmwareRelease(
480
+ plan,
481
+ PROTOCOL_V2_MAIN_FIRMWARE_TARGETS
482
+ );
483
+ const blePlan = summarizeProtocolV2FirmwareRelease(plan, PROTOCOL_V2_BLE_TARGETS);
484
+ const bootloaderPlan = summarizeProtocolV2FirmwareRelease(plan, PROTOCOL_V2_BOOTLOADER_TARGETS);
485
+ const { status } = plan;
453
486
 
454
487
  return {
455
- firmware: {
456
- status: firmwareStatus,
457
- changelog: release ? [release.changelog] : [],
458
- release: release ?? emptyRelease,
459
- bootloaderMode: state.status.mode === 'bootloader' || state.status.mode === 'romloader',
460
- },
461
- ble: {
462
- status: 'valid',
463
- release: emptyRelease,
464
- },
465
- bootloader: {
466
- status: 'valid',
467
- release: emptyRelease,
468
- },
488
+ firmware: toProtocolV2FirmwareReleaseInfo({ plan: firmwarePlan, state, release }),
489
+ ble: toProtocolV2FirmwareReleaseInfo({
490
+ plan: blePlan,
491
+ state,
492
+ release: getProtocolV2ComponentReleaseInfo(plan, 'COPROCESSOR'),
493
+ }),
494
+ bootloader: toProtocolV2FirmwareReleaseInfo({
495
+ plan: bootloaderPlan,
496
+ state,
497
+ release: getProtocolV2ComponentReleaseInfo(plan, 'BOOTLOADER'),
498
+ }),
469
499
  features,
470
500
  protocol: 'V2',
471
501
  deviceType: state.identity.deviceType,
472
502
  ...plan,
503
+ status,
473
504
  resourceStatus,
474
- hasUpgrade: plan.hasUpgrade || resourceStatus === 'outdated',
505
+ resourceArchive: resourceSource,
506
+ hasUpgrade: targetsToUpdate.length > 0,
475
507
  targetsToUpdate,
508
+ firmwareUpdatePlan,
476
509
  };
477
510
  }
478
511
  }
@@ -1,8 +1,20 @@
1
1
  import { BaseMethod } from './BaseMethod';
2
2
  import { UI_REQUEST } from '../constants/ui-request';
3
3
  import { getBleFirmwareReleaseInfo } from './firmware/releaseHelper';
4
+ import {
5
+ PROTOCOL_V2_BLE_TARGETS,
6
+ getProtocolV2ComponentReleaseInfo,
7
+ loadProtocolV2FirmwareReleaseContext,
8
+ summarizeProtocolV2FirmwareRelease,
9
+ toProtocolV2FirmwareReleaseInfo,
10
+ } from './firmware/protocolV2Release';
11
+ import { buildProtocolV2FirmwareRelease } from './CheckAllFirmwareRelease';
4
12
 
5
13
  export default class CheckBLEFirmwareRelease extends BaseMethod {
14
+ getSupportedProtocols() {
15
+ return ['V1', 'V2'] as const;
16
+ }
17
+
6
18
  init() {
7
19
  this.allowDeviceMode = [
8
20
  ...this.allowDeviceMode,
@@ -13,11 +25,31 @@ export default class CheckBLEFirmwareRelease extends BaseMethod {
13
25
  this.skipForceUpdateCheck = true;
14
26
  }
15
27
 
16
- run() {
17
- if (this.device.features) {
18
- const releaseInfo = getBleFirmwareReleaseInfo(this.device.features);
19
- return Promise.resolve(releaseInfo);
28
+ async run() {
29
+ if (!this.device.features) return null;
30
+
31
+ if (this.device.isProtocolV2()) {
32
+ const { state, firmwareType, release } = await loadProtocolV2FirmwareReleaseContext({
33
+ device: this.device,
34
+ methodName: 'checkBLEFirmwareRelease',
35
+ });
36
+ const plan = summarizeProtocolV2FirmwareRelease(
37
+ buildProtocolV2FirmwareRelease({
38
+ currentVersions: state.versions,
39
+ firmwareType,
40
+ release,
41
+ deviceType: state.identity.deviceType,
42
+ }),
43
+ PROTOCOL_V2_BLE_TARGETS
44
+ );
45
+ return toProtocolV2FirmwareReleaseInfo({
46
+ plan,
47
+ state,
48
+ release: getProtocolV2ComponentReleaseInfo(plan, 'COPROCESSOR'),
49
+ });
20
50
  }
21
- return Promise.resolve(null);
51
+
52
+ const releaseInfo = getBleFirmwareReleaseInfo(this.device.features);
53
+ return releaseInfo;
22
54
  }
23
55
  }
@@ -1,10 +1,22 @@
1
1
  import { BaseMethod } from './BaseMethod';
2
2
  import { UI_REQUEST } from '../constants/ui-request';
3
3
  import { getBootloaderReleaseInfo } from './firmware/releaseHelper';
4
+ import {
5
+ PROTOCOL_V2_BOOTLOADER_TARGETS,
6
+ getProtocolV2ComponentReleaseInfo,
7
+ loadProtocolV2FirmwareReleaseContext,
8
+ summarizeProtocolV2FirmwareRelease,
9
+ toProtocolV2FirmwareReleaseInfo,
10
+ } from './firmware/protocolV2Release';
11
+ import { buildProtocolV2FirmwareRelease } from './CheckAllFirmwareRelease';
4
12
 
5
13
  import type { CheckBootloaderReleaseParams } from '../types/api/checkBootloaderRelease';
6
14
 
7
15
  export default class CheckBootloaderRelease extends BaseMethod {
16
+ getSupportedProtocols() {
17
+ return ['V1', 'V2'] as const;
18
+ }
19
+
8
20
  init() {
9
21
  this.allowDeviceMode = [...this.allowDeviceMode, UI_REQUEST.BOOTLOADER];
10
22
  this.useDevicePassphraseState = false;
@@ -12,12 +24,32 @@ export default class CheckBootloaderRelease extends BaseMethod {
12
24
  }
13
25
 
14
26
  async run() {
15
- if (!this.device.features) {
16
- return null;
17
- }
27
+ if (!this.device.features) return null;
18
28
  const { features } = this.device;
19
29
  const payload = this.payload as CheckBootloaderReleaseParams;
20
30
 
31
+ if (this.device.isProtocolV2()) {
32
+ const { state, firmwareType, release } = await loadProtocolV2FirmwareReleaseContext({
33
+ device: this.device,
34
+ firmwareType: payload.firmwareType,
35
+ methodName: 'checkBootloaderRelease',
36
+ });
37
+ const plan = summarizeProtocolV2FirmwareRelease(
38
+ buildProtocolV2FirmwareRelease({
39
+ currentVersions: state.versions,
40
+ firmwareType,
41
+ release,
42
+ deviceType: state.identity.deviceType,
43
+ }),
44
+ PROTOCOL_V2_BOOTLOADER_TARGETS
45
+ );
46
+ return toProtocolV2FirmwareReleaseInfo({
47
+ plan,
48
+ state,
49
+ release: getProtocolV2ComponentReleaseInfo(plan, 'BOOTLOADER'),
50
+ });
51
+ }
52
+
21
53
  const deviceFirmwareType = this.device.getCurrentFirmwareType();
22
54
  const firmwareType = payload.firmwareType ?? deviceFirmwareType;
23
55
 
@@ -1,10 +1,21 @@
1
1
  import { BaseMethod } from './BaseMethod';
2
2
  import { UI_REQUEST } from '../constants/ui-request';
3
3
  import { getFirmwareReleaseInfo } from './firmware/releaseHelper';
4
+ import {
5
+ PROTOCOL_V2_MAIN_FIRMWARE_TARGETS,
6
+ loadProtocolV2FirmwareReleaseContext,
7
+ summarizeProtocolV2FirmwareRelease,
8
+ toProtocolV2FirmwareReleaseInfo,
9
+ } from './firmware/protocolV2Release';
10
+ import { buildProtocolV2FirmwareRelease } from './CheckAllFirmwareRelease';
4
11
 
5
12
  import type { CheckFirmwareReleaseParams } from '../types/api/checkFirmwareRelease';
6
13
 
7
14
  export default class CheckFirmwareRelease extends BaseMethod {
15
+ getSupportedProtocols() {
16
+ return ['V1', 'V2'] as const;
17
+ }
18
+
8
19
  init() {
9
20
  this.allowDeviceMode = [
10
21
  ...this.allowDeviceMode,
@@ -15,16 +26,33 @@ export default class CheckFirmwareRelease extends BaseMethod {
15
26
  this.skipForceUpdateCheck = true;
16
27
  }
17
28
 
18
- run() {
29
+ async run() {
19
30
  const payload = this.payload as CheckFirmwareReleaseParams;
20
31
 
21
- if (this.device.features) {
22
- const deviceFirmwareType = this.device.getCurrentFirmwareType();
23
- const firmwareType = payload.firmwareType ?? deviceFirmwareType;
32
+ if (!this.device.features) return null;
24
33
 
25
- const releaseInfo = getFirmwareReleaseInfo(this.device.features, firmwareType);
26
- return Promise.resolve(releaseInfo);
34
+ if (this.device.isProtocolV2()) {
35
+ const { state, firmwareType, release } = await loadProtocolV2FirmwareReleaseContext({
36
+ device: this.device,
37
+ firmwareType: payload.firmwareType,
38
+ methodName: 'checkFirmwareRelease',
39
+ });
40
+ const plan = summarizeProtocolV2FirmwareRelease(
41
+ buildProtocolV2FirmwareRelease({
42
+ currentVersions: state.versions,
43
+ firmwareType,
44
+ release,
45
+ deviceType: state.identity.deviceType,
46
+ }),
47
+ PROTOCOL_V2_MAIN_FIRMWARE_TARGETS
48
+ );
49
+ return toProtocolV2FirmwareReleaseInfo({ plan, state, release });
27
50
  }
28
- return Promise.resolve(null);
51
+
52
+ const deviceFirmwareType = this.device.getCurrentFirmwareType();
53
+ const firmwareType = payload.firmwareType ?? deviceFirmwareType;
54
+
55
+ const releaseInfo = getFirmwareReleaseInfo(this.device.features, firmwareType);
56
+ return releaseInfo;
29
57
  }
30
58
  }