@ledgerhq/dmk-ledger-wallet 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.js +1 -1
  2. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.js.map +3 -3
  3. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js +1 -1
  4. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js.map +3 -3
  5. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.js +1 -1
  6. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.js.map +2 -2
  7. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js +1 -1
  8. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js.map +2 -2
  9. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/types.js +1 -1
  10. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/types.js.map +2 -2
  11. package/lib/cjs/index.js +1 -1
  12. package/lib/cjs/index.js.map +2 -2
  13. package/lib/cjs/package.json +1 -1
  14. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.js +1 -1
  15. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.js.map +3 -3
  16. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js +1 -1
  17. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js.map +3 -3
  18. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.js +1 -1
  19. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.js.map +2 -2
  20. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js +1 -1
  21. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js.map +2 -2
  22. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/types.js.map +2 -2
  23. package/lib/esm/index.js +1 -1
  24. package/lib/esm/index.js.map +2 -2
  25. package/lib/esm/package.json +1 -1
  26. package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.d.ts +3 -3
  27. package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.d.ts.map +1 -1
  28. package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.d.ts +2 -2
  29. package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.d.ts.map +1 -1
  30. package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/types.d.ts +10 -2
  31. package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/types.d.ts.map +1 -1
  32. package/lib/types/index.d.ts +1 -1
  33. package/lib/types/index.d.ts.map +1 -1
  34. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  35. package/package.json +5 -5
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "sourcesContent": ["// Custom Lock Screen Utilities - Codec (device binary format)\nexport type { DecodeImageFromDeviceResult } from \"./api/customLockScreenUtils/codec/decodeImageFromDevice\";\nexport { decodeImageFromDevice } from \"./api/customLockScreenUtils/codec/decodeImageFromDevice\";\nexport type { EncodeImageForDeviceArgs } from \"./api/customLockScreenUtils/codec/encodeImageForDevice\";\nexport { encodeImageForDevice } from \"./api/customLockScreenUtils/codec/encodeImageForDevice\";\n\n// Custom Lock Screen Utilities - Fit (resize/crop to screen)\n// Note: These functions require a Web runtime environment (browser)\nexport { loadImageFromFile } from \"./api/customLockScreenUtils/fit/canvasUtils\";\nexport { centerCropResizeImage } from \"./api/customLockScreenUtils/fit/imageFit\";\n\n// Custom Lock Screen Utilities - Grayscale (color conversion & dithering)\n// Note: These functions require a Web runtime environment (browser)\nexport { convertToGrayscale as processImage } from \"./api/customLockScreenUtils/grayscale/grayscaleDithering\";\nexport { renderPixelDataToImage } from \"./api/customLockScreenUtils/grayscale/pixelDataRenderer\";\n\n// Custom Lock Screen Utilities - Screen Specs\nexport type {\n CLSSupportedDeviceModelId,\n ScreenSpecs,\n} from \"./api/customLockScreenUtils/screenSpecs\";\nexport {\n getScreenSpecs,\n getScreenVisibleAreaDimensions,\n isCustomLockScreenSupported,\n} from \"./api/customLockScreenUtils/screenSpecs\";\n\n// Custom Lock Screen Utilities - Types\nexport type {\n CenteredResult,\n DitheringAlgorithm,\n ImageDimensions,\n ProcessImageArgs,\n ProcessorResult,\n RenderPixelDataToImageArgs,\n RenderPixelDataToImageResult,\n} from \"./api/customLockScreenUtils/types\";\nexport {\n ImageCropError,\n ImageResizeError,\n ImageSizeLoadingError,\n} from \"./api/customLockScreenUtils/types\";\nexport {\n CustomLockScreenDeviceInternalErrorDAError,\n DeviceInRecoveryModeDAError,\n type DownloadCommandsDAError,\n InvalidCustomLockScreenImageDataDAError,\n InvalidCustomLockScreenStateDAError,\n NoCustomLockScreenImageDAError,\n type RemoveCommandDAError,\n type UploadCommandsDAError,\n} from \"./api/device-action/customLockScreenDeviceActionErrors\";\n\n// Device Actions\nexport {\n BackupAppStorageCommand,\n type BackupAppStorageCommandErrorCodes,\n type BackupAppStorageCommandResponse,\n type BackupAppStorageCommandResult,\n} from \"./api/command/OsUpdate/Backup/BackupAppStorageCommand\";\nexport {\n GetAppStorageInfoCommand,\n type GetAppStorageInfoCommandArgs,\n type GetAppStorageInfoCommandErrorCodes,\n type GetAppStorageInfoCommandResponse,\n type GetAppStorageInfoCommandResult,\n} from \"./api/command/OsUpdate/Backup/GetAppStorageInfoCommand\";\nexport {\n CommitRestoreAppStorageCommand,\n CommitRestoreAppStorageCommandError,\n type CommitRestoreAppStorageCommandErrorCodes,\n type CommitRestoreAppStorageCommandResult,\n} from \"./api/command/OsUpdate/Restore/CommitRestoreAppStorageCommand\";\nexport {\n InitRestoreAppStorageCommand,\n type InitRestoreAppStorageCommandArgs,\n InitRestoreAppStorageCommandError,\n type InitRestoreAppStorageCommandErrorCodes,\n type InitRestoreAppStorageCommandResult,\n} from \"./api/command/OsUpdate/Restore/InitRestoreAppStorageCommand\";\nexport {\n RequestMasterConsentCommand,\n type RequestMasterConsentCommandArgs,\n type RequestMasterConsentCommandErrorCodes,\n type RequestMasterConsentCommandResult,\n} from \"./api/command/OsUpdate/Restore/RequestMasterConsentCommand\";\nexport {\n RestoreAppStorageCommand,\n type RestoreAppStorageCommandArgs,\n RestoreAppStorageCommandError,\n type RestoreAppStorageCommandErrorCodes,\n type RestoreAppStorageCommandResult,\n} from \"./api/command/OsUpdate/Restore/RestoreAppStorageCommand\";\nexport { DownloadCustomLockScreenDeviceAction } from \"./api/device-action/DownloadCustomLockScreen/DownloadCustomLockScreenDeviceAction\";\nexport type {\n DownloadCustomLockScreenDAError,\n DownloadCustomLockScreenDAInput,\n DownloadCustomLockScreenDAIntermediateValue,\n DownloadCustomLockScreenDAOutput,\n DownloadCustomLockScreenDARequiredInteraction,\n DownloadCustomLockScreenDAState,\n} from \"./api/device-action/DownloadCustomLockScreen/types\";\nexport { GetCustomLockScreenInfoDeviceAction } from \"./api/device-action/GetCustomLockScreenInfo/GetCustomLockScreenInfoDeviceAction\";\nexport type {\n GetCustomLockScreenInfoDAError,\n GetCustomLockScreenInfoDAInput,\n GetCustomLockScreenInfoDAIntermediateValue,\n GetCustomLockScreenInfoDAOutput,\n GetCustomLockScreenInfoDARequiredInteraction,\n GetCustomLockScreenInfoDAState,\n} from \"./api/device-action/GetCustomLockScreenInfo/types\";\nexport { CreateBackupDeviceAction } from \"./api/device-action/OsUpdate/Backup/CreateBackupDeviceAction\";\nexport type {\n Backup,\n CreateBackupDAError,\n CreateBackupDAInput,\n CreateBackupDAIntermediateValue,\n CreateBackupDAOutput,\n CreateBackupDARequiredInteraction,\n CreateBackupDAState,\n CreateBackupSteps,\n} from \"./api/device-action/OsUpdate/Backup/types\";\nexport { CleanDeviceDeviceAction } from \"./api/device-action/OsUpdate/CleanDevice/CleanDeviceDeviceAction\";\nexport type {\n CleanDeviceDAError,\n CleanDeviceDAInput,\n CleanDeviceDAIntermediateValue,\n CleanDeviceDAOutput,\n CleanDeviceDARequiredInteraction,\n CleanDeviceDAState,\n} from \"./api/device-action/OsUpdate/CleanDevice/types\";\nexport { ResolveOsUpdatePathDeviceAction } from \"./api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceAction\";\nexport type {\n ResolveOsUpdatePathDAError,\n ResolveOsUpdatePathDAInput,\n ResolveOsUpdatePathDAIntermediateValue,\n ResolveOsUpdatePathDAOutput,\n ResolveOsUpdatePathDARequiredInteraction,\n ResolveOsUpdatePathDAState,\n ResolveOsUpdatePathSteps,\n} from \"./api/device-action/OsUpdate/Resolve/types\";\nexport { RestoreAppsStorageDeviceAction } from \"./api/device-action/OsUpdate/Restore/RestoreAppsStorage/RestoreAppsStorageDeviceAction\";\nexport type {\n RestoreAppsStorageDAError,\n RestoreAppsStorageDAInput,\n RestoreAppsStorageDAIntermediateValue,\n RestoreAppsStorageDAOutput,\n RestoreAppsStorageDARequiredInteraction,\n RestoreAppsStorageDAState,\n RestoreAppsStorageSteps,\n RestoreAppStorageResult,\n} from \"./api/device-action/OsUpdate/Restore/RestoreAppsStorage/types\";\nexport { RestoreBackupDeviceAction } from \"./api/device-action/OsUpdate/Restore/RestoreBackup/RestoreBackupDeviceAction\";\nexport type {\n RestoreAppResult,\n RestoreBackupDAError,\n RestoreBackupDAInput,\n RestoreBackupDAIntermediateValue,\n RestoreBackupDAOutput,\n RestoreBackupDARequiredInteraction,\n RestoreBackupDAState,\n RestoreBackupSteps,\n} from \"./api/device-action/OsUpdate/Restore/RestoreBackup/types\";\nexport type {\n BaseFirmware,\n FinalFirmware,\n McuFirmware,\n OsuFirmware,\n OsUpdate,\n} from \"./api/device-action/OsUpdate/Shared/types\";\nexport { FlashMcuDeviceAction } from \"./api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction\";\nexport type {\n FlashMcuDAError,\n FlashMcuDAInput,\n FlashMcuDAIntermediateValue,\n FlashMcuDARequiredInteraction,\n FlashMcuDAState,\n FlashMcuSteps,\n} from \"./api/device-action/OsUpdate/Update/FlashMcu/types\";\nexport { InstallOsUpdateDeviceAction } from \"./api/device-action/OsUpdate/Update/InstallOsUpdate/InstallOsUpdateDeviceAction\";\nexport type {\n InstallOsUpdateDAError,\n InstallOsUpdateDAInput,\n InstallOsUpdateDAIntermediateValue,\n InstallOsUpdateDARequiredInteraction,\n InstallOsUpdateDAState,\n InstallOsUpdateSteps,\n} from \"./api/device-action/OsUpdate/Update/InstallOsUpdate/types\";\nexport { RemoveCustomLockScreenDeviceAction } from \"./api/device-action/RemoveCustomLockScreen/RemoveCustomLockScreenDeviceAction\";\nexport type {\n RemoveCustomLockScreenDAError,\n RemoveCustomLockScreenDAInput,\n RemoveCustomLockScreenDAIntermediateValue,\n RemoveCustomLockScreenDAOutput,\n RemoveCustomLockScreenDARequiredInteraction,\n RemoveCustomLockScreenDAState,\n} from \"./api/device-action/RemoveCustomLockScreen/types\";\nexport type {\n UploadCustomLockScreenDAError,\n UploadCustomLockScreenDAInput,\n UploadCustomLockScreenDAIntermediateValue,\n UploadCustomLockScreenDAOutput,\n UploadCustomLockScreenDARequiredInteraction,\n UploadCustomLockScreenDAState,\n} from \"./api/device-action/UploadCustomLockScreen/types\";\nexport { UploadCustomLockScreenDeviceAction } from \"./api/device-action/UploadCustomLockScreen/UploadCustomLockScreenDeviceAction\";\nexport { BackupAppStorageTask } from \"./api/task/OsUpdate/Backup/BackupAppStorageTask\";\nexport {\n RestoreAppStorageTask,\n type RestoreAppStorageTaskArgs,\n type RestoreAppStorageTaskError,\n} from \"./api/task/OsUpdate/Restore/RestoreAppStorageTask\";\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,00EAAAE,EAAAF,GAEA,IAAAG,EAAsC,mEAEtCC,EAAqC,kEAIrCC,EAAkC,uDAClCC,EAAsC,oDAItCC,EAAmD,oEACnDC,EAAuC,mEAOvCC,EAIO,mDAYPC,EAIO,6CACPC,EASO,kEAGPC,EAKO,iEACPC,EAMO,kEACPC,EAKO,yEACPC,EAMO,uEACPC,EAKO,sEACPC,EAMO,mEACPC,EAAqD,6FASrDC,EAAoD,2FASpDC,EAAyC,wEAWzCC,EAAwC,4EASxCC,EAAgD,gFAUhDC,EAA+C,kGAW/CC,EAA0C,wFAkB1CC,EAAqC,6EASrCC,EAA4C,2FAS5CC,EAAmD,yFAiBnDC,EAAmD,yFACnDC,EAAqC,2DACrCC,EAIO",
4
+ "sourcesContent": ["// Custom Lock Screen Utilities - Codec (device binary format)\nexport type { DecodeImageFromDeviceResult } from \"./api/customLockScreenUtils/codec/decodeImageFromDevice\";\nexport { decodeImageFromDevice } from \"./api/customLockScreenUtils/codec/decodeImageFromDevice\";\nexport type { EncodeImageForDeviceArgs } from \"./api/customLockScreenUtils/codec/encodeImageForDevice\";\nexport { encodeImageForDevice } from \"./api/customLockScreenUtils/codec/encodeImageForDevice\";\n\n// Custom Lock Screen Utilities - Fit (resize/crop to screen)\n// Note: These functions require a Web runtime environment (browser)\nexport { loadImageFromFile } from \"./api/customLockScreenUtils/fit/canvasUtils\";\nexport { centerCropResizeImage } from \"./api/customLockScreenUtils/fit/imageFit\";\n\n// Custom Lock Screen Utilities - Grayscale (color conversion & dithering)\n// Note: These functions require a Web runtime environment (browser)\nexport { convertToGrayscale as processImage } from \"./api/customLockScreenUtils/grayscale/grayscaleDithering\";\nexport { renderPixelDataToImage } from \"./api/customLockScreenUtils/grayscale/pixelDataRenderer\";\n\n// Custom Lock Screen Utilities - Screen Specs\nexport type {\n CLSSupportedDeviceModelId,\n ScreenSpecs,\n} from \"./api/customLockScreenUtils/screenSpecs\";\nexport {\n getScreenSpecs,\n getScreenVisibleAreaDimensions,\n isCustomLockScreenSupported,\n} from \"./api/customLockScreenUtils/screenSpecs\";\n\n// Custom Lock Screen Utilities - Types\nexport type {\n CenteredResult,\n DitheringAlgorithm,\n ImageDimensions,\n ProcessImageArgs,\n ProcessorResult,\n RenderPixelDataToImageArgs,\n RenderPixelDataToImageResult,\n} from \"./api/customLockScreenUtils/types\";\nexport {\n ImageCropError,\n ImageResizeError,\n ImageSizeLoadingError,\n} from \"./api/customLockScreenUtils/types\";\nexport {\n CustomLockScreenDeviceInternalErrorDAError,\n DeviceInRecoveryModeDAError,\n type DownloadCommandsDAError,\n InvalidCustomLockScreenImageDataDAError,\n InvalidCustomLockScreenStateDAError,\n NoCustomLockScreenImageDAError,\n type RemoveCommandDAError,\n type UploadCommandsDAError,\n} from \"./api/device-action/customLockScreenDeviceActionErrors\";\n\n// Device Actions\nexport {\n BackupAppStorageCommand,\n type BackupAppStorageCommandErrorCodes,\n type BackupAppStorageCommandResponse,\n type BackupAppStorageCommandResult,\n} from \"./api/command/OsUpdate/Backup/BackupAppStorageCommand\";\nexport {\n GetAppStorageInfoCommand,\n type GetAppStorageInfoCommandArgs,\n type GetAppStorageInfoCommandErrorCodes,\n type GetAppStorageInfoCommandResponse,\n type GetAppStorageInfoCommandResult,\n} from \"./api/command/OsUpdate/Backup/GetAppStorageInfoCommand\";\nexport {\n CommitRestoreAppStorageCommand,\n CommitRestoreAppStorageCommandError,\n type CommitRestoreAppStorageCommandErrorCodes,\n type CommitRestoreAppStorageCommandResult,\n} from \"./api/command/OsUpdate/Restore/CommitRestoreAppStorageCommand\";\nexport {\n InitRestoreAppStorageCommand,\n type InitRestoreAppStorageCommandArgs,\n InitRestoreAppStorageCommandError,\n type InitRestoreAppStorageCommandErrorCodes,\n type InitRestoreAppStorageCommandResult,\n} from \"./api/command/OsUpdate/Restore/InitRestoreAppStorageCommand\";\nexport {\n RequestMasterConsentCommand,\n type RequestMasterConsentCommandArgs,\n type RequestMasterConsentCommandErrorCodes,\n type RequestMasterConsentCommandResult,\n} from \"./api/command/OsUpdate/Restore/RequestMasterConsentCommand\";\nexport {\n RestoreAppStorageCommand,\n type RestoreAppStorageCommandArgs,\n RestoreAppStorageCommandError,\n type RestoreAppStorageCommandErrorCodes,\n type RestoreAppStorageCommandResult,\n} from \"./api/command/OsUpdate/Restore/RestoreAppStorageCommand\";\nexport { DownloadCustomLockScreenDeviceAction } from \"./api/device-action/DownloadCustomLockScreen/DownloadCustomLockScreenDeviceAction\";\nexport type {\n DownloadCustomLockScreenDAError,\n DownloadCustomLockScreenDAInput,\n DownloadCustomLockScreenDAIntermediateValue,\n DownloadCustomLockScreenDAOutput,\n DownloadCustomLockScreenDARequiredInteraction,\n DownloadCustomLockScreenDAState,\n} from \"./api/device-action/DownloadCustomLockScreen/types\";\nexport { GetCustomLockScreenInfoDeviceAction } from \"./api/device-action/GetCustomLockScreenInfo/GetCustomLockScreenInfoDeviceAction\";\nexport type {\n GetCustomLockScreenInfoDAError,\n GetCustomLockScreenInfoDAInput,\n GetCustomLockScreenInfoDAIntermediateValue,\n GetCustomLockScreenInfoDAOutput,\n GetCustomLockScreenInfoDARequiredInteraction,\n GetCustomLockScreenInfoDAState,\n} from \"./api/device-action/GetCustomLockScreenInfo/types\";\nexport { CreateBackupDeviceAction } from \"./api/device-action/OsUpdate/Backup/CreateBackupDeviceAction\";\nexport type {\n Backup,\n CreateBackupDAError,\n CreateBackupDAInput,\n CreateBackupDAIntermediateValue,\n CreateBackupDAOutput,\n CreateBackupDARequiredInteraction,\n CreateBackupDAState,\n CreateBackupSteps,\n} from \"./api/device-action/OsUpdate/Backup/types\";\nexport { CleanDeviceDeviceAction } from \"./api/device-action/OsUpdate/CleanDevice/CleanDeviceDeviceAction\";\nexport type {\n CleanDeviceDAError,\n CleanDeviceDAInput,\n CleanDeviceDAIntermediateValue,\n CleanDeviceDAOutput,\n CleanDeviceDARequiredInteraction,\n CleanDeviceDAState,\n} from \"./api/device-action/OsUpdate/CleanDevice/types\";\nexport { ResolveOsUpdatePathDeviceAction } from \"./api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceAction\";\nexport type {\n ResolveOsUpdatePathDAError,\n ResolveOsUpdatePathDAInput,\n ResolveOsUpdatePathDAIntermediateValue,\n ResolveOsUpdatePathDAOutput,\n ResolveOsUpdatePathDARequiredInteraction,\n ResolveOsUpdatePathDAState,\n ResolveOsUpdatePathSteps,\n} from \"./api/device-action/OsUpdate/Resolve/types\";\nexport { RestoreAppsStorageDeviceAction } from \"./api/device-action/OsUpdate/Restore/RestoreAppsStorage/RestoreAppsStorageDeviceAction\";\nexport type {\n RestoreAppsStorageDAError,\n RestoreAppsStorageDAInput,\n RestoreAppsStorageDAIntermediateValue,\n RestoreAppsStorageDAOutput,\n RestoreAppsStorageDARequiredInteraction,\n RestoreAppsStorageDAState,\n RestoreAppsStorageSteps,\n RestoreAppStorageResult,\n} from \"./api/device-action/OsUpdate/Restore/RestoreAppsStorage/types\";\nexport { RestoreBackupDeviceAction } from \"./api/device-action/OsUpdate/Restore/RestoreBackup/RestoreBackupDeviceAction\";\nexport type {\n RestoreAppResult,\n RestoreBackupDAError,\n RestoreBackupDAInput,\n RestoreBackupDAIntermediateValue,\n RestoreBackupDAOutput,\n RestoreBackupDARequiredInteraction,\n RestoreBackupDAState,\n RestoreBackupSteps,\n} from \"./api/device-action/OsUpdate/Restore/RestoreBackup/types\";\nexport type {\n BaseFirmware,\n FinalFirmware,\n McuFirmware,\n OsuFirmware,\n OsUpdate,\n} from \"./api/device-action/OsUpdate/Shared/types\";\nexport { FlashMcuDeviceAction } from \"./api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction\";\nexport type {\n FlashMcuDAError,\n FlashMcuDAInput,\n FlashMcuDAIntermediateValue,\n FlashMcuDAOutput,\n FlashMcuDARequiredInteraction,\n FlashMcuDAState,\n FlashMcuSteps,\n FlashTarget,\n} from \"./api/device-action/OsUpdate/Update/FlashMcu/types\";\nexport { InstallOsUpdateDeviceAction } from \"./api/device-action/OsUpdate/Update/InstallOsUpdate/InstallOsUpdateDeviceAction\";\nexport type {\n InstallOsUpdateDAError,\n InstallOsUpdateDAInput,\n InstallOsUpdateDAIntermediateValue,\n InstallOsUpdateDARequiredInteraction,\n InstallOsUpdateDAState,\n InstallOsUpdateSteps,\n} from \"./api/device-action/OsUpdate/Update/InstallOsUpdate/types\";\nexport { RemoveCustomLockScreenDeviceAction } from \"./api/device-action/RemoveCustomLockScreen/RemoveCustomLockScreenDeviceAction\";\nexport type {\n RemoveCustomLockScreenDAError,\n RemoveCustomLockScreenDAInput,\n RemoveCustomLockScreenDAIntermediateValue,\n RemoveCustomLockScreenDAOutput,\n RemoveCustomLockScreenDARequiredInteraction,\n RemoveCustomLockScreenDAState,\n} from \"./api/device-action/RemoveCustomLockScreen/types\";\nexport type {\n UploadCustomLockScreenDAError,\n UploadCustomLockScreenDAInput,\n UploadCustomLockScreenDAIntermediateValue,\n UploadCustomLockScreenDAOutput,\n UploadCustomLockScreenDARequiredInteraction,\n UploadCustomLockScreenDAState,\n} from \"./api/device-action/UploadCustomLockScreen/types\";\nexport { UploadCustomLockScreenDeviceAction } from \"./api/device-action/UploadCustomLockScreen/UploadCustomLockScreenDeviceAction\";\nexport { BackupAppStorageTask } from \"./api/task/OsUpdate/Backup/BackupAppStorageTask\";\nexport {\n RestoreAppStorageTask,\n type RestoreAppStorageTaskArgs,\n type RestoreAppStorageTaskError,\n} from \"./api/task/OsUpdate/Restore/RestoreAppStorageTask\";\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,00EAAAE,EAAAF,GAEA,IAAAG,EAAsC,mEAEtCC,EAAqC,kEAIrCC,EAAkC,uDAClCC,EAAsC,oDAItCC,EAAmD,oEACnDC,EAAuC,mEAOvCC,EAIO,mDAYPC,EAIO,6CACPC,EASO,kEAGPC,EAKO,iEACPC,EAMO,kEACPC,EAKO,yEACPC,EAMO,uEACPC,EAKO,sEACPC,EAMO,mEACPC,EAAqD,6FASrDC,EAAoD,2FASpDC,EAAyC,wEAWzCC,EAAwC,4EASxCC,EAAgD,gFAUhDC,EAA+C,kGAW/CC,EAA0C,wFAkB1CC,EAAqC,6EAWrCC,EAA4C,2FAS5CC,EAAmD,yFAiBnDC,EAAmD,yFACnDC,EAAqC,2DACrCC,EAIO",
6
6
  "names": ["index_exports", "__export", "__toCommonJS", "import_decodeImageFromDevice", "import_encodeImageForDevice", "import_canvasUtils", "import_imageFit", "import_grayscaleDithering", "import_pixelDataRenderer", "import_screenSpecs", "import_types", "import_customLockScreenDeviceActionErrors", "import_BackupAppStorageCommand", "import_GetAppStorageInfoCommand", "import_CommitRestoreAppStorageCommand", "import_InitRestoreAppStorageCommand", "import_RequestMasterConsentCommand", "import_RestoreAppStorageCommand", "import_DownloadCustomLockScreenDeviceAction", "import_GetCustomLockScreenInfoDeviceAction", "import_CreateBackupDeviceAction", "import_CleanDeviceDeviceAction", "import_ResolveOsUpdatePathDeviceAction", "import_RestoreAppsStorageDeviceAction", "import_RestoreBackupDeviceAction", "import_FlashMcuDeviceAction", "import_InstallOsUpdateDeviceAction", "import_RemoveCustomLockScreenDeviceAction", "import_UploadCustomLockScreenDeviceAction", "import_BackupAppStorageTask", "import_RestoreAppStorageTask"]
7
7
  }
@@ -59,5 +59,5 @@
59
59
  "watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
60
60
  "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
61
61
  },
62
- "version": "0.6.0"
62
+ "version": "0.7.0"
63
63
  }
@@ -1,2 +1,2 @@
1
- import{SecureChannelEventType as n,UserInteractionRequired as l,XStateDeviceAction as c}from"@ledgerhq/device-management-kit";import{Left as u,Right as d}from"purify-ts";import{assign as t,fromObservable as p,fromPromise as i,setup as h}from"xstate";import{getOsVersion as v}from"../../../../device-action/OsUpdate/Shared/Substeps/GetOsVersion";import{flashMcu as M}from"./Substeps/FlashMcu";import{resolveMcuVersion as m}from"./Substeps/ResolveMcuVersion";import{BootloaderModeTimeoutError as S}from"./FlashMcuDeviceActionErrors";import{FlashMcuSteps as a}from"./types";const s=10,D=2e3;class _ extends c{makeStateMachine(o){return h({types:{input:{},output:{},context:{}},actors:{getDeviceInfo:i(v(o)),resolveMcuVersion:i(m(o)),flashMcu:p(M(o))},delays:{bootloaderPollInterval:D},guards:{isDeviceInBootloaderMode:({context:e})=>e._internalState.deviceInfo?.isBootloader===!0,hasReachedMaxAttempts:({context:e})=>e._internalState.bootloaderPollAttempts>=s,hasError:({context:e})=>e._internalState.error!==null},actions:{assignErrorFromEvent:t({_internalState:e=>({...e.context._internalState,error:e.event.error})})}}).createMachine({id:"FlashMcuDeviceAction",initial:"GetDeviceInfo",context:({input:e})=>({input:e,intermediateValue:{requiredUserInteraction:l.None,step:a.Idle},_internalState:{error:null,deviceInfo:null,version:null,bootloaderPollAttempts:0}}),states:{GetDeviceInfo:{entry:t({intermediateValue:e=>({...e.context.intermediateValue,step:a.GetDeviceInfo}),_internalState:e=>({...e.context._internalState,bootloaderPollAttempts:e.context._internalState.bootloaderPollAttempts+1})}),invoke:{src:"getDeviceInfo",onDone:{actions:t({_internalState:e=>e.event.output.caseOf({Left:r=>({...e.context._internalState,error:r}),Right:r=>({...e.context._internalState,deviceInfo:r})})}),target:"CheckGetDeviceInfo"},onError:{actions:"assignErrorFromEvent",target:"Error"}}},CheckGetDeviceInfo:{always:[{guard:"hasError",target:"Error"},{guard:"isDeviceInBootloaderMode",target:"ResolveMcuVersion"},{guard:"hasReachedMaxAttempts",actions:t({_internalState:e=>({...e.context._internalState,error:new S(`Device did not enter bootloader mode after ${s} attempts`)})}),target:"Error"},{target:"WaitForBootloaderMode"}]},WaitForBootloaderMode:{after:{bootloaderPollInterval:{target:"GetDeviceInfo"}}},ResolveMcuVersion:{entry:t({intermediateValue:e=>({...e.context.intermediateValue,step:a.ResolveMcuVersion})}),invoke:{src:"resolveMcuVersion",input:({context:e})=>({...e.input,deviceInfo:e._internalState.deviceInfo}),onDone:{actions:t({_internalState:e=>e.event.output.caseOf({Left:r=>({...e.context._internalState,error:r}),Right:r=>({...e.context._internalState,version:r})})}),target:"CheckResolveMcuVersion"},onError:{actions:"assignErrorFromEvent",target:"Error"}}},CheckResolveMcuVersion:{always:[{guard:"hasError",target:"Error"},{target:"FlashMcuOrBootloader"}]},FlashMcuOrBootloader:{entry:t({intermediateValue:e=>({...e.context.intermediateValue,step:a.FlashMcuOrBootloader})}),invoke:{src:"flashMcu",input:({context:e})=>({deviceInfo:e._internalState.deviceInfo,version:e._internalState.version}),onSnapshot:{actions:t({intermediateValue:e=>e.event.snapshot.context?.type===n.Progress?{...e.context.intermediateValue,progress:e.event.snapshot.context.payload.progress}:{...e.context.intermediateValue},_internalState:e=>e.event.snapshot.context?.type===n.Error?{...e.context._internalState,error:e.event.snapshot.context.error.mapFlashMcuDAErrors()}:e.context._internalState})},onDone:{target:"CheckFlashMcu"},onError:{actions:"assignErrorFromEvent",target:"Error"}}},CheckFlashMcu:{always:[{guard:"hasError",target:"Error"},{target:"Success"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:e})=>e._internalState.error!==null?u(e._internalState.error):d(void 0)})}}export{_ as FlashMcuDeviceAction};
1
+ import{SecureChannelEventType as n,UserInteractionRequired as i,XStateDeviceAction as c}from"@ledgerhq/device-management-kit";import{Left as u,Right as p}from"purify-ts";import{assign as t,fromObservable as h,fromPromise as s,setup as d}from"xstate";import{getOsVersion as M}from"../../../../device-action/OsUpdate/Shared/Substeps/GetOsVersion";import{flashMcu as v}from"./Substeps/FlashMcu";import{resolveMcuVersion as m}from"./Substeps/ResolveMcuVersion";import{BootloaderModeTimeoutError as S}from"./FlashMcuDeviceActionErrors";import{FlashMcuSteps as a}from"./types";const l=10,D=2e3;class _ extends c{makeStateMachine(o){return d({types:{input:{},output:{},context:{}},actors:{getDeviceInfo:s(M(o)),resolveMcuVersion:s(m(o)),flashMcu:h(v(o))},delays:{bootloaderPollInterval:D},guards:{isDeviceInBootloaderMode:({context:e})=>e._internalState.deviceInfo?.isBootloader===!0,hasReachedMaxAttempts:({context:e})=>e._internalState.bootloaderPollAttempts>=l,hasError:({context:e})=>e._internalState.error!==null},actions:{assignErrorFromEvent:t({_internalState:e=>({...e.context._internalState,error:e.event.error})})}}).createMachine({id:"FlashMcuDeviceAction",initial:"GetDeviceInfo",context:({input:e})=>({input:e,intermediateValue:{requiredUserInteraction:i.None,step:a.Idle},_internalState:{error:null,deviceInfo:null,resolvedFlash:null,bootloaderPollAttempts:0}}),states:{GetDeviceInfo:{entry:t({intermediateValue:e=>({...e.context.intermediateValue,step:a.GetDeviceInfo}),_internalState:e=>({...e.context._internalState,bootloaderPollAttempts:e.context._internalState.bootloaderPollAttempts+1})}),invoke:{src:"getDeviceInfo",onDone:{actions:t({_internalState:e=>e.event.output.caseOf({Left:r=>({...e.context._internalState,error:r}),Right:r=>({...e.context._internalState,deviceInfo:r})})}),target:"CheckGetDeviceInfo"},onError:{actions:"assignErrorFromEvent",target:"Error"}}},CheckGetDeviceInfo:{always:[{guard:"hasError",target:"Error"},{guard:"isDeviceInBootloaderMode",target:"ResolveMcuVersion"},{guard:"hasReachedMaxAttempts",actions:t({_internalState:e=>({...e.context._internalState,error:new S(`Device did not enter bootloader mode after ${l} attempts`)})}),target:"Error"},{target:"WaitForBootloaderMode"}]},WaitForBootloaderMode:{after:{bootloaderPollInterval:{target:"GetDeviceInfo"}}},ResolveMcuVersion:{entry:t({intermediateValue:e=>({...e.context.intermediateValue,step:a.ResolveMcuVersion})}),invoke:{src:"resolveMcuVersion",input:({context:e})=>({...e.input,deviceInfo:e._internalState.deviceInfo}),onDone:{actions:t({_internalState:e=>e.event.output.caseOf({Left:r=>({...e.context._internalState,error:r}),Right:r=>({...e.context._internalState,resolvedFlash:r})})}),target:"CheckResolveMcuVersion"},onError:{actions:"assignErrorFromEvent",target:"Error"}}},CheckResolveMcuVersion:{always:[{guard:"hasError",target:"Error"},{target:"FlashMcuOrBootloader"}]},FlashMcuOrBootloader:{entry:t({intermediateValue:e=>({...e.context.intermediateValue,step:a.FlashMcuOrBootloader})}),invoke:{src:"flashMcu",input:({context:e})=>({deviceInfo:e._internalState.deviceInfo,version:e._internalState.resolvedFlash.version}),onSnapshot:{actions:t({intermediateValue:e=>e.event.snapshot.context?.type===n.Progress?{...e.context.intermediateValue,progress:e.event.snapshot.context.payload.progress}:{...e.context.intermediateValue},_internalState:e=>e.event.snapshot.context?.type===n.Error?{...e.context._internalState,error:e.event.snapshot.context.error.mapFlashMcuDAErrors()}:e.context._internalState})},onDone:{target:"CheckFlashMcu"},onError:{actions:"assignErrorFromEvent",target:"Error"}}},CheckFlashMcu:{always:[{guard:"hasError",target:"Error"},{target:"Success"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:e})=>e._internalState.error!==null?u(e._internalState.error):p({target:e._internalState.resolvedFlash.target})})}}export{_ as FlashMcuDeviceAction};
2
2
  //# sourceMappingURL=FlashMcuDeviceAction.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.ts"],
4
- "sourcesContent": ["import {\n type DeviceActionStateMachine,\n type InternalApi,\n SecureChannelEventType,\n type StateMachineTypes,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { assign, fromObservable, fromPromise, setup } from \"xstate\";\n\nimport { getOsVersion } from \"@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion\";\n\nimport { flashMcu } from \"./Substeps/FlashMcu\";\nimport { resolveMcuVersion } from \"./Substeps/ResolveMcuVersion\";\nimport { BootloaderModeTimeoutError } from \"./FlashMcuDeviceActionErrors\";\nimport {\n type FlashMcuDAError,\n type FlashMcuDAInput,\n type FlashMcuDAIntermediateValue,\n type FlashMcuDAInternalState,\n FlashMcuSteps,\n} from \"./types\";\n\n/*\n * The device reboots into the bootloader on its own, so it can still answer as\n * the running OS for a short while. Poll a bounded number of times rather than\n * assuming it presents as a bootloader straight away.\n */\nconst MAX_BOOTLOADER_POLL_ATTEMPTS = 10;\nconst BOOTLOADER_POLL_INTERVAL_MS = 2000;\n\nexport class FlashMcuDeviceAction extends XStateDeviceAction<\n void,\n FlashMcuDAInput,\n FlashMcuDAError,\n FlashMcuDAIntermediateValue,\n FlashMcuDAInternalState\n> {\n protected override makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n void,\n FlashMcuDAInput,\n FlashMcuDAError,\n FlashMcuDAIntermediateValue,\n FlashMcuDAInternalState\n > {\n type types = StateMachineTypes<\n void,\n FlashMcuDAInput,\n FlashMcuDAError,\n FlashMcuDAIntermediateValue,\n FlashMcuDAInternalState\n >;\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n output: {} as types[\"output\"],\n context: {} as types[\"context\"],\n } as types,\n actors: {\n getDeviceInfo: fromPromise(getOsVersion(internalApi)),\n resolveMcuVersion: fromPromise(resolveMcuVersion(internalApi)),\n flashMcu: fromObservable(flashMcu(internalApi)),\n },\n delays: {\n bootloaderPollInterval: BOOTLOADER_POLL_INTERVAL_MS,\n },\n guards: {\n isDeviceInBootloaderMode: ({ context }) =>\n context._internalState.deviceInfo?.isBootloader === true,\n hasReachedMaxAttempts: ({ context }) =>\n context._internalState.bootloaderPollAttempts >=\n MAX_BOOTLOADER_POLL_ATTEMPTS,\n hasError: ({ context }) => context._internalState.error !== null,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: _.event[\"error\"], // NOTE: should never happen\n }),\n }),\n },\n }).createMachine({\n id: \"FlashMcuDeviceAction\",\n initial: \"GetDeviceInfo\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: FlashMcuSteps.Idle,\n },\n _internalState: {\n error: null,\n deviceInfo: null,\n version: null,\n bootloaderPollAttempts: 0,\n },\n }),\n states: {\n GetDeviceInfo: {\n entry: assign({\n intermediateValue: (_) => ({\n ..._.context.intermediateValue,\n step: FlashMcuSteps.GetDeviceInfo,\n }),\n _internalState: (_) => ({\n ..._.context._internalState,\n bootloaderPollAttempts:\n _.context._internalState.bootloaderPollAttempts + 1,\n }),\n }),\n invoke: {\n src: \"getDeviceInfo\",\n onDone: {\n actions: assign({\n _internalState: (_) =>\n _.event.output.caseOf<FlashMcuDAInternalState>({\n Left: (error) => ({\n ..._.context._internalState,\n error,\n }),\n Right: (getOsVersionResponse) => ({\n ..._.context._internalState,\n deviceInfo: getOsVersionResponse,\n }),\n }),\n }),\n target: \"CheckGetDeviceInfo\",\n },\n onError: {\n actions: \"assignErrorFromEvent\",\n target: \"Error\",\n },\n },\n },\n CheckGetDeviceInfo: {\n always: [\n {\n guard: \"hasError\",\n target: \"Error\",\n },\n {\n guard: \"isDeviceInBootloaderMode\",\n target: \"ResolveMcuVersion\",\n },\n {\n guard: \"hasReachedMaxAttempts\",\n actions: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new BootloaderModeTimeoutError(\n `Device did not enter bootloader mode after ${MAX_BOOTLOADER_POLL_ATTEMPTS} attempts`,\n ),\n }),\n }),\n target: \"Error\",\n },\n {\n target: \"WaitForBootloaderMode\",\n },\n ],\n },\n WaitForBootloaderMode: {\n after: {\n bootloaderPollInterval: {\n target: \"GetDeviceInfo\",\n },\n },\n },\n ResolveMcuVersion: {\n entry: assign({\n intermediateValue: (_) => ({\n ..._.context.intermediateValue,\n step: FlashMcuSteps.ResolveMcuVersion,\n }),\n }),\n invoke: {\n src: \"resolveMcuVersion\",\n input: ({ context }) => ({\n ...context.input,\n deviceInfo: context._internalState.deviceInfo!,\n }),\n onDone: {\n actions: assign({\n _internalState: (_) =>\n _.event.output.caseOf<FlashMcuDAInternalState>({\n Left: (error) => ({\n ..._.context._internalState,\n error,\n }),\n Right: (version) => ({\n ..._.context._internalState,\n version,\n }),\n }),\n }),\n target: \"CheckResolveMcuVersion\",\n },\n onError: {\n actions: \"assignErrorFromEvent\",\n target: \"Error\",\n },\n },\n },\n CheckResolveMcuVersion: {\n always: [\n {\n guard: \"hasError\",\n target: \"Error\",\n },\n {\n target: \"FlashMcuOrBootloader\",\n },\n ],\n },\n FlashMcuOrBootloader: {\n entry: assign({\n intermediateValue: (_) => ({\n ..._.context.intermediateValue,\n step: FlashMcuSteps.FlashMcuOrBootloader,\n }),\n }),\n invoke: {\n src: \"flashMcu\",\n input: ({ context }) => ({\n deviceInfo: context._internalState.deviceInfo!,\n version: context._internalState.version!,\n }),\n onSnapshot: {\n actions: assign({\n // Flashing the MCU needs no device confirmation, so the bulk\n // exchange only reports progress here.\n intermediateValue: (_) =>\n _.event.snapshot.context?.type ===\n SecureChannelEventType.Progress\n ? {\n ..._.context.intermediateValue,\n progress: _.event.snapshot.context.payload.progress,\n }\n : { ..._.context.intermediateValue },\n _internalState: (_) => {\n if (\n _.event.snapshot.context?.type ===\n SecureChannelEventType.Error\n ) {\n return {\n ..._.context._internalState,\n error:\n _.event.snapshot.context.error.mapFlashMcuDAErrors(),\n };\n }\n return _.context._internalState;\n },\n }),\n },\n onDone: {\n target: \"CheckFlashMcu\",\n },\n onError: {\n actions: \"assignErrorFromEvent\",\n target: \"Error\",\n },\n },\n },\n CheckFlashMcu: {\n always: [\n {\n guard: \"hasError\",\n target: \"Error\",\n },\n {\n target: \"Success\",\n },\n ],\n },\n Success: {\n type: \"final\",\n },\n Error: {\n type: \"final\",\n },\n },\n output: ({ context }) =>\n context._internalState.error !== null\n ? Left(context._internalState.error)\n : Right(undefined),\n });\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["SecureChannelEventType", "UserInteractionRequired", "XStateDeviceAction", "Left", "Right", "assign", "fromObservable", "fromPromise", "setup", "getOsVersion", "flashMcu", "resolveMcuVersion", "BootloaderModeTimeoutError", "FlashMcuSteps", "MAX_BOOTLOADER_POLL_ATTEMPTS", "BOOTLOADER_POLL_INTERVAL_MS", "FlashMcuDeviceAction", "internalApi", "context", "_", "input", "error", "getOsVersionResponse", "version"]
4
+ "sourcesContent": ["import {\n type DeviceActionStateMachine,\n type InternalApi,\n SecureChannelEventType,\n type StateMachineTypes,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { assign, fromObservable, fromPromise, setup } from \"xstate\";\n\nimport { getOsVersion } from \"@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion\";\n\nimport { flashMcu } from \"./Substeps/FlashMcu\";\nimport { resolveMcuVersion } from \"./Substeps/ResolveMcuVersion\";\nimport { BootloaderModeTimeoutError } from \"./FlashMcuDeviceActionErrors\";\nimport {\n type FlashMcuDAError,\n type FlashMcuDAInput,\n type FlashMcuDAIntermediateValue,\n type FlashMcuDAInternalState,\n type FlashMcuDAOutput,\n FlashMcuSteps,\n} from \"./types\";\n\n/*\n * The device reboots into the bootloader on its own, so it can still answer as\n * the running OS for a short while. Poll a bounded number of times rather than\n * assuming it presents as a bootloader straight away.\n */\nconst MAX_BOOTLOADER_POLL_ATTEMPTS = 10;\nconst BOOTLOADER_POLL_INTERVAL_MS = 2000;\n\nexport class FlashMcuDeviceAction extends XStateDeviceAction<\n FlashMcuDAOutput,\n FlashMcuDAInput,\n FlashMcuDAError,\n FlashMcuDAIntermediateValue,\n FlashMcuDAInternalState\n> {\n protected override makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n FlashMcuDAOutput,\n FlashMcuDAInput,\n FlashMcuDAError,\n FlashMcuDAIntermediateValue,\n FlashMcuDAInternalState\n > {\n type types = StateMachineTypes<\n FlashMcuDAOutput,\n FlashMcuDAInput,\n FlashMcuDAError,\n FlashMcuDAIntermediateValue,\n FlashMcuDAInternalState\n >;\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n output: {} as types[\"output\"],\n context: {} as types[\"context\"],\n } as types,\n actors: {\n getDeviceInfo: fromPromise(getOsVersion(internalApi)),\n resolveMcuVersion: fromPromise(resolveMcuVersion(internalApi)),\n flashMcu: fromObservable(flashMcu(internalApi)),\n },\n delays: {\n bootloaderPollInterval: BOOTLOADER_POLL_INTERVAL_MS,\n },\n guards: {\n isDeviceInBootloaderMode: ({ context }) =>\n context._internalState.deviceInfo?.isBootloader === true,\n hasReachedMaxAttempts: ({ context }) =>\n context._internalState.bootloaderPollAttempts >=\n MAX_BOOTLOADER_POLL_ATTEMPTS,\n hasError: ({ context }) => context._internalState.error !== null,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: _.event[\"error\"], // NOTE: should never happen\n }),\n }),\n },\n }).createMachine({\n id: \"FlashMcuDeviceAction\",\n initial: \"GetDeviceInfo\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: FlashMcuSteps.Idle,\n },\n _internalState: {\n error: null,\n deviceInfo: null,\n resolvedFlash: null,\n bootloaderPollAttempts: 0,\n },\n }),\n states: {\n GetDeviceInfo: {\n entry: assign({\n intermediateValue: (_) => ({\n ..._.context.intermediateValue,\n step: FlashMcuSteps.GetDeviceInfo,\n }),\n _internalState: (_) => ({\n ..._.context._internalState,\n bootloaderPollAttempts:\n _.context._internalState.bootloaderPollAttempts + 1,\n }),\n }),\n invoke: {\n src: \"getDeviceInfo\",\n onDone: {\n actions: assign({\n _internalState: (_) =>\n _.event.output.caseOf<FlashMcuDAInternalState>({\n Left: (error) => ({\n ..._.context._internalState,\n error,\n }),\n Right: (getOsVersionResponse) => ({\n ..._.context._internalState,\n deviceInfo: getOsVersionResponse,\n }),\n }),\n }),\n target: \"CheckGetDeviceInfo\",\n },\n onError: {\n actions: \"assignErrorFromEvent\",\n target: \"Error\",\n },\n },\n },\n CheckGetDeviceInfo: {\n always: [\n {\n guard: \"hasError\",\n target: \"Error\",\n },\n {\n guard: \"isDeviceInBootloaderMode\",\n target: \"ResolveMcuVersion\",\n },\n {\n guard: \"hasReachedMaxAttempts\",\n actions: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new BootloaderModeTimeoutError(\n `Device did not enter bootloader mode after ${MAX_BOOTLOADER_POLL_ATTEMPTS} attempts`,\n ),\n }),\n }),\n target: \"Error\",\n },\n {\n target: \"WaitForBootloaderMode\",\n },\n ],\n },\n WaitForBootloaderMode: {\n after: {\n bootloaderPollInterval: {\n target: \"GetDeviceInfo\",\n },\n },\n },\n ResolveMcuVersion: {\n entry: assign({\n intermediateValue: (_) => ({\n ..._.context.intermediateValue,\n step: FlashMcuSteps.ResolveMcuVersion,\n }),\n }),\n invoke: {\n src: \"resolveMcuVersion\",\n input: ({ context }) => ({\n ...context.input,\n deviceInfo: context._internalState.deviceInfo!,\n }),\n onDone: {\n actions: assign({\n _internalState: (_) =>\n _.event.output.caseOf<FlashMcuDAInternalState>({\n Left: (error) => ({\n ..._.context._internalState,\n error,\n }),\n Right: (resolvedFlash) => ({\n ..._.context._internalState,\n resolvedFlash,\n }),\n }),\n }),\n target: \"CheckResolveMcuVersion\",\n },\n onError: {\n actions: \"assignErrorFromEvent\",\n target: \"Error\",\n },\n },\n },\n CheckResolveMcuVersion: {\n always: [\n {\n guard: \"hasError\",\n target: \"Error\",\n },\n {\n target: \"FlashMcuOrBootloader\",\n },\n ],\n },\n FlashMcuOrBootloader: {\n entry: assign({\n intermediateValue: (_) => ({\n ..._.context.intermediateValue,\n step: FlashMcuSteps.FlashMcuOrBootloader,\n }),\n }),\n invoke: {\n src: \"flashMcu\",\n input: ({ context }) => ({\n deviceInfo: context._internalState.deviceInfo!,\n version: context._internalState.resolvedFlash!.version,\n }),\n onSnapshot: {\n actions: assign({\n // Flashing the MCU needs no device confirmation, so the bulk\n // exchange only reports progress here.\n intermediateValue: (_) =>\n _.event.snapshot.context?.type ===\n SecureChannelEventType.Progress\n ? {\n ..._.context.intermediateValue,\n progress: _.event.snapshot.context.payload.progress,\n }\n : { ..._.context.intermediateValue },\n _internalState: (_) => {\n if (\n _.event.snapshot.context?.type ===\n SecureChannelEventType.Error\n ) {\n return {\n ..._.context._internalState,\n error:\n _.event.snapshot.context.error.mapFlashMcuDAErrors(),\n };\n }\n return _.context._internalState;\n },\n }),\n },\n onDone: {\n target: \"CheckFlashMcu\",\n },\n onError: {\n actions: \"assignErrorFromEvent\",\n target: \"Error\",\n },\n },\n },\n CheckFlashMcu: {\n always: [\n {\n guard: \"hasError\",\n target: \"Error\",\n },\n {\n target: \"Success\",\n },\n ],\n },\n Success: {\n type: \"final\",\n },\n Error: {\n type: \"final\",\n },\n },\n output: ({ context }) =>\n context._internalState.error !== null\n ? Left(context._internalState.error)\n : Right({ target: context._internalState.resolvedFlash!.target }),\n });\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["SecureChannelEventType", "UserInteractionRequired", "XStateDeviceAction", "Left", "Right", "assign", "fromObservable", "fromPromise", "setup", "getOsVersion", "flashMcu", "resolveMcuVersion", "BootloaderModeTimeoutError", "FlashMcuSteps", "MAX_BOOTLOADER_POLL_ATTEMPTS", "BOOTLOADER_POLL_INTERVAL_MS", "FlashMcuDeviceAction", "internalApi", "context", "_", "input", "error", "getOsVersionResponse", "resolvedFlash"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{DeviceActionStatus as w,OnboardingState as O,SecureChannelError as A,SecureChannelEventType as S,SeedWordCount as R,UnknownDAError as y,UserInteractionRequired as b}from"@ledgerhq/device-management-kit";import{Left as D,Right as h}from"purify-ts";import{Observable as k,of as F}from"rxjs";import{makeDeviceActionInternalApiMock as c}from"../../../../device-action/__test-utils__/makeInternalApi";import{testDeviceActionStates as l}from"../../../../device-action/__test-utils__/testDeviceActionStates";import{GetOsVersionError as x}from"../../../../device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors";import{getOsVersion as V}from"../../../../device-action/OsUpdate/Shared/Substeps/GetOsVersion";import{FlashMcuDeviceAction as B}from"../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction";import{BootloaderModeTimeoutError as C,ResolveMcuVersionError as I}from"../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors";import{flashMcu as T}from"../../../../device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu";import{resolveMcuVersion as G}from"../../../../device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion";import{FlashMcuSteps as e}from"../../../../device-action/OsUpdate/Update/FlashMcu/types";vi.mock("@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion");vi.mock("@api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion");vi.mock("@api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu");const o=(s,f={})=>({status:w.Pending,intermediateValue:{requiredUserInteraction:b.None,step:s,...f}}),M=()=>({status:w.Completed,output:void 0}),v=s=>({status:w.Error,error:s}),E=s=>Array.from({length:s*2-1},()=>o(e.GetDeviceInfo));describe("FlashMcuDeviceAction",()=>{const s={isBootloader:!0,isOsu:!1,targetId:16777217,seTargetId:857735172,mcuTargetId:16777217,seVersion:"1.3.0",seFlags:new Uint8Array([230,0,0,0]),mcuSephVersion:"",mcuBootloaderVersion:"1.16",hwVersion:"00",langId:0,recoverState:void 0,secureElementFlags:{isPinValidated:!0,hasMcuSerialNumber:!0,hasValidCertificate:!0,isCustomAuthorityConnectionAllowed:!1,isSecureConnectionAllowed:!1,isOnboarded:!0,isMcuCodeSigned:!0,isInRecoveryMode:!1,hasEndorsementCertificateInSlot1:!1,hasEndorsementCertificateInSlot2:!1,numberOfWords:R.TwentyFour,currentWordIndex:0,onboardingState:O.Unknown}},f={id:300,version:"1.4.0",perso:"perso",firmware:"final",firmwareKey:"final-key",hash:"final-hash",bytes:123,mcuVersions:[1]};beforeEach(()=>{vi.resetAllMocks()});const u=(t=h(s))=>vi.mocked(V).mockReturnValue(()=>Promise.resolve(t)),g=t=>{const r=[...t];vi.mocked(V).mockReturnValue(()=>Promise.resolve(r.shift()??h(s)))},d=(t=h("1.12"))=>{const r=vi.fn().mockResolvedValue(t);return vi.mocked(G).mockReturnValue(r),r},p=(t=F())=>{const r=vi.fn().mockReturnValue(t);return vi.mocked(T).mockReturnValue(r),r},i=(t={mode:"osUpdate",finalFirmware:f})=>new B({input:t});describe("Success",()=>{it("Should flash the MCU when the device is already in bootloader mode",()=>new Promise((t,r)=>{u();const n=d(),a=p(),m=[o(e.GetDeviceInfo),o(e.ResolveMcuVersion),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),M()];l(i(),m,c(),{onDone:()=>{expect(n).toHaveBeenCalledWith(expect.objectContaining({input:{mode:"osUpdate",deviceInfo:s,finalFirmware:f}})),expect(a).toHaveBeenCalledWith(expect.objectContaining({input:{deviceInfo:s,version:"1.12"}})),t()},onError:r})})),it("Should flash the MCU in bootloader recovery mode without a final firmware",()=>new Promise((t,r)=>{u();const n=d(),a=p(),m=[o(e.GetDeviceInfo),o(e.ResolveMcuVersion),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),M()];l(i({mode:"bootloaderRecovery"}),m,c(),{onDone:()=>{expect(n).toHaveBeenCalledWith(expect.objectContaining({input:{mode:"bootloaderRecovery",deviceInfo:s}})),expect(a).toHaveBeenCalledWith(expect.objectContaining({input:{deviceInfo:s,version:"1.12"}})),t()},onError:r})})),it("Should poll until the device enters bootloader mode",async()=>{vi.useFakeTimers(),g([h({...s,isBootloader:!1}),h({...s,isBootloader:!1}),h(s)]),d(),p();const t=[...E(3),o(e.ResolveMcuVersion),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),M()],r=new Promise((n,a)=>{l(i(),t,c(),{onDone:n,onError:a})});await vi.advanceTimersByTimeAsync(2e3*3),await r,vi.useRealTimers()}),it("Should report the flash progress",()=>new Promise((t,r)=>{u(),d(),p(F({type:S.Progress,payload:{progress:.5,index:0,total:2}},{type:S.Progress,payload:{progress:1,index:1,total:2}}));const n=[o(e.GetDeviceInfo),o(e.ResolveMcuVersion),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader,{progress:.5}),o(e.FlashMcuOrBootloader,{progress:1}),M()];l(i(),n,c(),{onDone:t,onError:r})}))}),describe("Error",()=>{it("Should go to Error when getOsVersion returns Left",()=>new Promise((t,r)=>{const n=new x(new Error("command failed"));u(D(n));const a=[o(e.GetDeviceInfo),v(n)];l(i(),a,c(),{onDone:t,onError:r})})),it("Should go to Error when the device never enters bootloader mode",async()=>{vi.useFakeTimers(),u(h({...s,isBootloader:!1}));const t=[...E(10),v(new C("Device did not enter bootloader mode after 10 attempts"))],r=new Promise((n,a)=>{l(i(),t,c(),{onDone:n,onError:a})});await vi.advanceTimersByTimeAsync(2e3*11),await r,vi.useRealTimers()}),it("Should go to Error when resolveMcuVersion returns Left",()=>new Promise((t,r)=>{u();const n=new I("no compatible MCU");d(D(n));const a=[o(e.GetDeviceInfo),o(e.ResolveMcuVersion),v(n)];l(i(),a,c(),{onDone:t,onError:r})})),it("Should map a secure channel error event to a device action error",()=>new Promise((t,r)=>{u(),d(),p(F({type:S.Error,error:new A("flash failed")}));const n=[o(e.GetDeviceInfo),o(e.ResolveMcuVersion),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),v(new y)];l(i(),n,c(),{onDone:t,onError:r})})),it("Should go to Error when the secure channel connection cannot be opened",()=>new Promise((t,r)=>{u(),d();const n=new y("Invalid WebSocket connection");p(new k(m=>{m.error(n)}));const a=[o(e.GetDeviceInfo),o(e.ResolveMcuVersion),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),v(n)];l(i(),a,c(),{onDone:t,onError:r})}))})});
1
+ import{DeviceActionStatus as w,OnboardingState as O,SecureChannelError as R,SecureChannelEventType as S,SeedWordCount as b,UnknownDAError as D,UserInteractionRequired as A}from"@ledgerhq/device-management-kit";import{Left as y,Right as h}from"purify-ts";import{Observable as x,of as F}from"rxjs";import{makeDeviceActionInternalApiMock as c}from"../../../../device-action/__test-utils__/makeInternalApi";import{testDeviceActionStates as l}from"../../../../device-action/__test-utils__/testDeviceActionStates";import{GetOsVersionError as B}from"../../../../device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors";import{getOsVersion as V}from"../../../../device-action/OsUpdate/Shared/Substeps/GetOsVersion";import{FlashMcuDeviceAction as C}from"../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction";import{BootloaderModeTimeoutError as I,ResolveMcuVersionError as k}from"../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors";import{flashMcu as T}from"../../../../device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu";import{resolveMcuVersion as G}from"../../../../device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion";import{FlashMcuSteps as e}from"../../../../device-action/OsUpdate/Update/FlashMcu/types";vi.mock("@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion");vi.mock("@api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion");vi.mock("@api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu");const o=(s,M={})=>({status:w.Pending,intermediateValue:{requiredUserInteraction:A.None,step:s,...M}}),m=(s="mcu")=>({status:w.Completed,output:{target:s}}),f=s=>({status:w.Error,error:s}),g=s=>Array.from({length:s*2-1},()=>o(e.GetDeviceInfo));describe("FlashMcuDeviceAction",()=>{const s={isBootloader:!0,isOsu:!1,targetId:16777217,seTargetId:857735172,mcuTargetId:16777217,seVersion:"1.3.0",seFlags:new Uint8Array([230,0,0,0]),mcuSephVersion:"",mcuBootloaderVersion:"1.16",hwVersion:"00",langId:0,recoverState:void 0,secureElementFlags:{isPinValidated:!0,hasMcuSerialNumber:!0,hasValidCertificate:!0,isCustomAuthorityConnectionAllowed:!1,isSecureConnectionAllowed:!1,isOnboarded:!0,isMcuCodeSigned:!0,isInRecoveryMode:!1,hasEndorsementCertificateInSlot1:!1,hasEndorsementCertificateInSlot2:!1,numberOfWords:b.TwentyFour,currentWordIndex:0,onboardingState:O.Unknown}},M={id:300,version:"1.4.0",perso:"perso",firmware:"final",firmwareKey:"final-key",hash:"final-hash",bytes:123,mcuVersions:[1]};beforeEach(()=>{vi.resetAllMocks()});const u=(t=h(s))=>vi.mocked(V).mockReturnValue(()=>Promise.resolve(t)),E=t=>{const r=[...t];vi.mocked(V).mockReturnValue(()=>Promise.resolve(r.shift()??h(s)))},d=(t=h({target:"mcu",version:"1.12"}))=>{const r=vi.fn().mockResolvedValue(t);return vi.mocked(G).mockReturnValue(r),r},p=(t=F())=>{const r=vi.fn().mockReturnValue(t);return vi.mocked(T).mockReturnValue(r),r},i=(t={mode:"osUpdate",finalFirmware:M})=>new C({input:t});describe("Success",()=>{it("Should flash the MCU when the device is already in bootloader mode",()=>new Promise((t,r)=>{u();const n=d(),a=p(),v=[o(e.GetDeviceInfo),o(e.ResolveMcuVersion),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),m()];l(i(),v,c(),{onDone:()=>{expect(n).toHaveBeenCalledWith(expect.objectContaining({input:{mode:"osUpdate",deviceInfo:s,finalFirmware:M}})),expect(a).toHaveBeenCalledWith(expect.objectContaining({input:{deviceInfo:s,version:"1.12"}})),t()},onError:r})})),it("Should report a bootloader flash when that is what was resolved",()=>new Promise((t,r)=>{u(),d(h({target:"bootloader",version:"0.6"}));const n=p(),a=[o(e.GetDeviceInfo),o(e.ResolveMcuVersion),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),m("bootloader")];l(i(),a,c(),{onDone:()=>{expect(n).toHaveBeenCalledWith(expect.objectContaining({input:{deviceInfo:s,version:"0.6"}})),t()},onError:r})})),it("Should flash the MCU in bootloader recovery mode without a final firmware",()=>new Promise((t,r)=>{u();const n=d(),a=p(),v=[o(e.GetDeviceInfo),o(e.ResolveMcuVersion),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),m()];l(i({mode:"bootloaderRecovery"}),v,c(),{onDone:()=>{expect(n).toHaveBeenCalledWith(expect.objectContaining({input:{mode:"bootloaderRecovery",deviceInfo:s}})),expect(a).toHaveBeenCalledWith(expect.objectContaining({input:{deviceInfo:s,version:"1.12"}})),t()},onError:r})})),it("Should poll until the device enters bootloader mode",async()=>{vi.useFakeTimers(),E([h({...s,isBootloader:!1}),h({...s,isBootloader:!1}),h(s)]),d(),p();const t=[...g(3),o(e.ResolveMcuVersion),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),m()],r=new Promise((n,a)=>{l(i(),t,c(),{onDone:n,onError:a})});await vi.advanceTimersByTimeAsync(2e3*3),await r,vi.useRealTimers()}),it("Should report the flash progress",()=>new Promise((t,r)=>{u(),d(),p(F({type:S.Progress,payload:{progress:.5,index:0,total:2}},{type:S.Progress,payload:{progress:1,index:1,total:2}}));const n=[o(e.GetDeviceInfo),o(e.ResolveMcuVersion),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader,{progress:.5}),o(e.FlashMcuOrBootloader,{progress:1}),m()];l(i(),n,c(),{onDone:t,onError:r})}))}),describe("Error",()=>{it("Should go to Error when getOsVersion returns Left",()=>new Promise((t,r)=>{const n=new B(new Error("command failed"));u(y(n));const a=[o(e.GetDeviceInfo),f(n)];l(i(),a,c(),{onDone:t,onError:r})})),it("Should go to Error when the device never enters bootloader mode",async()=>{vi.useFakeTimers(),u(h({...s,isBootloader:!1}));const t=[...g(10),f(new I("Device did not enter bootloader mode after 10 attempts"))],r=new Promise((n,a)=>{l(i(),t,c(),{onDone:n,onError:a})});await vi.advanceTimersByTimeAsync(2e3*11),await r,vi.useRealTimers()}),it("Should go to Error when resolveMcuVersion returns Left",()=>new Promise((t,r)=>{u();const n=new k("no compatible MCU");d(y(n));const a=[o(e.GetDeviceInfo),o(e.ResolveMcuVersion),f(n)];l(i(),a,c(),{onDone:t,onError:r})})),it("Should map a secure channel error event to a device action error",()=>new Promise((t,r)=>{u(),d(),p(F({type:S.Error,error:new R("flash failed")}));const n=[o(e.GetDeviceInfo),o(e.ResolveMcuVersion),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),f(new D)];l(i(),n,c(),{onDone:t,onError:r})})),it("Should go to Error when the secure channel connection cannot be opened",()=>new Promise((t,r)=>{u(),d();const n=new D("Invalid WebSocket connection");p(new x(v=>{v.error(n)}));const a=[o(e.GetDeviceInfo),o(e.ResolveMcuVersion),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),f(n)];l(i(),a,c(),{onDone:t,onError:r})}))})});
2
2
  //# sourceMappingURL=FlashMcuDeviceAction.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.ts"],
4
- "sourcesContent": ["import {\n DeviceActionStatus,\n type GetOsVersionResponse,\n OnboardingState,\n SecureChannelError,\n SecureChannelEventType,\n SeedWordCount,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, Left, Right } from \"purify-ts\";\nimport { Observable, of } from \"rxjs\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { testDeviceActionStates } from \"@api/device-action/__test-utils__/testDeviceActionStates\";\nimport { GetOsVersionError } from \"@api/device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors\";\nimport { getOsVersion } from \"@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion\";\nimport { type FinalFirmware } from \"@api/device-action/OsUpdate/Shared/types\";\nimport { FlashMcuDeviceAction } from \"@api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction\";\nimport {\n BootloaderModeTimeoutError,\n ResolveMcuVersionError,\n} from \"@api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors\";\nimport { flashMcu } from \"@api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu\";\nimport { resolveMcuVersion } from \"@api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion\";\nimport {\n type FlashMcuDAError,\n type FlashMcuDAInput,\n type FlashMcuDAState,\n FlashMcuSteps,\n} from \"@api/device-action/OsUpdate/Update/FlashMcu/types\";\n\nvi.mock(\"@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion\");\nvi.mock(\n \"@api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion\",\n);\nvi.mock(\"@api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu\");\n\nconst pendingState = (\n step: FlashMcuSteps,\n intermediateValue: { progress?: number } = {},\n): FlashMcuDAState => ({\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step,\n ...intermediateValue,\n },\n});\n\nconst completedState = (): FlashMcuDAState => ({\n status: DeviceActionStatus.Completed,\n output: undefined,\n});\n\nconst errorState = (error: FlashMcuDAError): FlashMcuDAState => ({\n status: DeviceActionStatus.Error,\n error,\n});\n\n/*\n * A poll that does not find the device in bootloader mode emits twice: once on\n * entering GetDeviceInfo, once on entering the waiting state.\n */\nconst bootloaderPollStates = (attempts: number): FlashMcuDAState[] =>\n Array.from({ length: attempts * 2 - 1 }, () =>\n pendingState(FlashMcuSteps.GetDeviceInfo),\n );\n\ndescribe(\"FlashMcuDeviceAction\", () => {\n const getOsVersionResponse = {\n isBootloader: true,\n isOsu: false,\n targetId: 0x01000001,\n seTargetId: 0x33200004,\n mcuTargetId: 0x01000001,\n seVersion: \"1.3.0\",\n seFlags: new Uint8Array([0xe6, 0x00, 0x00, 0x00]),\n mcuSephVersion: \"\",\n mcuBootloaderVersion: \"1.16\",\n hwVersion: \"00\",\n langId: 0,\n recoverState: undefined,\n secureElementFlags: {\n isPinValidated: true,\n hasMcuSerialNumber: true,\n hasValidCertificate: true,\n isCustomAuthorityConnectionAllowed: false,\n isSecureConnectionAllowed: false,\n isOnboarded: true,\n isMcuCodeSigned: true,\n isInRecoveryMode: false,\n hasEndorsementCertificateInSlot1: false,\n hasEndorsementCertificateInSlot2: false,\n numberOfWords: SeedWordCount.TwentyFour,\n currentWordIndex: 0,\n onboardingState: OnboardingState.Unknown,\n },\n } satisfies GetOsVersionResponse;\n\n const finalFirmware = {\n id: 300,\n version: \"1.4.0\",\n perso: \"perso\",\n firmware: \"final\",\n firmwareKey: \"final-key\",\n hash: \"final-hash\",\n bytes: 123,\n mcuVersions: [1],\n } satisfies FinalFirmware;\n\n type SecureChannelEvents = ReturnType<ReturnType<typeof flashMcu>>;\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n const setupGetOsVersion = (\n result: Either<unknown, GetOsVersionResponse> = Right(getOsVersionResponse),\n ) =>\n vi\n .mocked(getOsVersion)\n .mockReturnValue(\n () =>\n Promise.resolve(result) as ReturnType<\n ReturnType<typeof getOsVersion>\n >,\n );\n\n const setupGetOsVersionSequence = (\n results: Array<Either<unknown, GetOsVersionResponse>>,\n ) => {\n const remaining = [...results];\n vi.mocked(getOsVersion).mockReturnValue(\n () =>\n Promise.resolve(\n remaining.shift() ?? Right(getOsVersionResponse),\n ) as ReturnType<ReturnType<typeof getOsVersion>>,\n );\n };\n\n const setupResolveMcuVersion = (\n result: Either<unknown, string> = Right(\"1.12\"),\n ) => {\n const handler = vi.fn().mockResolvedValue(result);\n vi.mocked(resolveMcuVersion).mockReturnValue(\n handler as unknown as ReturnType<typeof resolveMcuVersion>,\n );\n return handler;\n };\n\n const setupFlashMcu = (events: SecureChannelEvents = of()) => {\n const handler = vi.fn().mockReturnValue(events);\n vi.mocked(flashMcu).mockReturnValue(handler);\n return handler;\n };\n\n const makeDeviceAction = (\n input: FlashMcuDAInput = { mode: \"osUpdate\", finalFirmware },\n ) => new FlashMcuDeviceAction({ input });\n\n describe(\"Success\", () => {\n it(\"Should flash the MCU when the device is already in bootloader mode\", () =>\n new Promise<void>((resolve, reject) => {\n setupGetOsVersion();\n const resolveMcuVersionHandler = setupResolveMcuVersion();\n const flashMcuHandler = setupFlashMcu();\n\n const expectedStates: FlashMcuDAState[] = [\n pendingState(FlashMcuSteps.GetDeviceInfo),\n pendingState(FlashMcuSteps.ResolveMcuVersion),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n completedState(),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: () => {\n expect(resolveMcuVersionHandler).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n mode: \"osUpdate\",\n deviceInfo: getOsVersionResponse,\n finalFirmware,\n },\n }),\n );\n expect(flashMcuHandler).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n deviceInfo: getOsVersionResponse,\n version: \"1.12\",\n },\n }),\n );\n resolve();\n },\n onError: reject,\n },\n );\n }));\n\n it(\"Should flash the MCU in bootloader recovery mode without a final firmware\", () =>\n new Promise<void>((resolve, reject) => {\n setupGetOsVersion();\n const resolveMcuVersionHandler = setupResolveMcuVersion();\n const flashMcuHandler = setupFlashMcu();\n\n const expectedStates: FlashMcuDAState[] = [\n pendingState(FlashMcuSteps.GetDeviceInfo),\n pendingState(FlashMcuSteps.ResolveMcuVersion),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n completedState(),\n ];\n\n testDeviceActionStates(\n makeDeviceAction({ mode: \"bootloaderRecovery\" }),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: () => {\n expect(resolveMcuVersionHandler).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n mode: \"bootloaderRecovery\",\n deviceInfo: getOsVersionResponse,\n },\n }),\n );\n expect(flashMcuHandler).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n deviceInfo: getOsVersionResponse,\n version: \"1.12\",\n },\n }),\n );\n resolve();\n },\n onError: reject,\n },\n );\n }));\n\n it(\"Should poll until the device enters bootloader mode\", async () => {\n vi.useFakeTimers();\n setupGetOsVersionSequence([\n Right({ ...getOsVersionResponse, isBootloader: false }),\n Right({ ...getOsVersionResponse, isBootloader: false }),\n Right(getOsVersionResponse),\n ]);\n setupResolveMcuVersion();\n setupFlashMcu();\n\n const expectedStates: FlashMcuDAState[] = [\n ...bootloaderPollStates(3),\n pendingState(FlashMcuSteps.ResolveMcuVersion),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n completedState(),\n ];\n\n const done = new Promise<void>((resolve, reject) => {\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n });\n\n await vi.advanceTimersByTimeAsync(2000 * 3);\n await done;\n vi.useRealTimers();\n });\n\n it(\"Should report the flash progress\", () =>\n new Promise<void>((resolve, reject) => {\n setupGetOsVersion();\n setupResolveMcuVersion();\n setupFlashMcu(\n of(\n {\n type: SecureChannelEventType.Progress,\n payload: { progress: 0.5, index: 0, total: 2 },\n },\n {\n type: SecureChannelEventType.Progress,\n payload: { progress: 1, index: 1, total: 2 },\n },\n ) as SecureChannelEvents,\n );\n\n const expectedStates: FlashMcuDAState[] = [\n pendingState(FlashMcuSteps.GetDeviceInfo),\n pendingState(FlashMcuSteps.ResolveMcuVersion),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader, { progress: 0.5 }),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader, { progress: 1 }),\n completedState(),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n });\n\n describe(\"Error\", () => {\n it(\"Should go to Error when getOsVersion returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n const error = new GetOsVersionError(new Error(\"command failed\"));\n setupGetOsVersion(Left(error));\n\n const expectedStates: FlashMcuDAState[] = [\n pendingState(FlashMcuSteps.GetDeviceInfo),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"Should go to Error when the device never enters bootloader mode\", async () => {\n vi.useFakeTimers();\n setupGetOsVersion(\n Right({ ...getOsVersionResponse, isBootloader: false }),\n );\n\n const expectedStates: FlashMcuDAState[] = [\n ...bootloaderPollStates(10),\n errorState(\n new BootloaderModeTimeoutError(\n \"Device did not enter bootloader mode after 10 attempts\",\n ),\n ),\n ];\n\n const done = new Promise<void>((resolve, reject) => {\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n });\n\n await vi.advanceTimersByTimeAsync(2000 * 11);\n await done;\n vi.useRealTimers();\n });\n\n it(\"Should go to Error when resolveMcuVersion returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupGetOsVersion();\n const error = new ResolveMcuVersionError(\"no compatible MCU\");\n setupResolveMcuVersion(Left(error));\n\n const expectedStates: FlashMcuDAState[] = [\n pendingState(FlashMcuSteps.GetDeviceInfo),\n pendingState(FlashMcuSteps.ResolveMcuVersion),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"Should map a secure channel error event to a device action error\", () =>\n new Promise<void>((resolve, reject) => {\n setupGetOsVersion();\n setupResolveMcuVersion();\n setupFlashMcu(\n of({\n type: SecureChannelEventType.Error,\n error: new SecureChannelError(\"flash failed\"),\n }) as SecureChannelEvents,\n );\n\n const expectedStates: FlashMcuDAState[] = [\n pendingState(FlashMcuSteps.GetDeviceInfo),\n pendingState(FlashMcuSteps.ResolveMcuVersion),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n errorState(new UnknownDAError()),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"Should go to Error when the secure channel connection cannot be opened\", () =>\n new Promise<void>((resolve, reject) => {\n setupGetOsVersion();\n setupResolveMcuVersion();\n const error = new UnknownDAError(\"Invalid WebSocket connection\");\n setupFlashMcu(\n new Observable((subscriber) => {\n subscriber.error(error);\n }) as SecureChannelEvents,\n );\n\n const expectedStates: FlashMcuDAState[] = [\n pendingState(FlashMcuSteps.GetDeviceInfo),\n pendingState(FlashMcuSteps.ResolveMcuVersion),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["DeviceActionStatus", "OnboardingState", "SecureChannelError", "SecureChannelEventType", "SeedWordCount", "UnknownDAError", "UserInteractionRequired", "Left", "Right", "Observable", "of", "makeDeviceActionInternalApiMock", "testDeviceActionStates", "GetOsVersionError", "getOsVersion", "FlashMcuDeviceAction", "BootloaderModeTimeoutError", "ResolveMcuVersionError", "flashMcu", "resolveMcuVersion", "FlashMcuSteps", "pendingState", "step", "intermediateValue", "completedState", "errorState", "error", "bootloaderPollStates", "attempts", "getOsVersionResponse", "finalFirmware", "setupGetOsVersion", "result", "setupGetOsVersionSequence", "results", "remaining", "setupResolveMcuVersion", "handler", "setupFlashMcu", "events", "makeDeviceAction", "input", "resolve", "reject", "resolveMcuVersionHandler", "flashMcuHandler", "expectedStates", "done", "subscriber"]
4
+ "sourcesContent": ["import {\n DeviceActionStatus,\n type GetOsVersionResponse,\n OnboardingState,\n SecureChannelError,\n SecureChannelEventType,\n SeedWordCount,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, Left, Right } from \"purify-ts\";\nimport { Observable, of } from \"rxjs\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { testDeviceActionStates } from \"@api/device-action/__test-utils__/testDeviceActionStates\";\nimport { GetOsVersionError } from \"@api/device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors\";\nimport { getOsVersion } from \"@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion\";\nimport { type FinalFirmware } from \"@api/device-action/OsUpdate/Shared/types\";\nimport { FlashMcuDeviceAction } from \"@api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction\";\nimport {\n BootloaderModeTimeoutError,\n ResolveMcuVersionError,\n} from \"@api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors\";\nimport { flashMcu } from \"@api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu\";\nimport { resolveMcuVersion } from \"@api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion\";\nimport {\n type FlashMcuDAError,\n type FlashMcuDAInput,\n type FlashMcuDAState,\n FlashMcuSteps,\n type FlashTarget,\n type ResolvedFlash,\n} from \"@api/device-action/OsUpdate/Update/FlashMcu/types\";\n\nvi.mock(\"@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion\");\nvi.mock(\n \"@api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion\",\n);\nvi.mock(\"@api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu\");\n\nconst pendingState = (\n step: FlashMcuSteps,\n intermediateValue: { progress?: number } = {},\n): FlashMcuDAState => ({\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step,\n ...intermediateValue,\n },\n});\n\nconst completedState = (target: FlashTarget = \"mcu\"): FlashMcuDAState => ({\n status: DeviceActionStatus.Completed,\n output: { target },\n});\n\nconst errorState = (error: FlashMcuDAError): FlashMcuDAState => ({\n status: DeviceActionStatus.Error,\n error,\n});\n\n/*\n * A poll that does not find the device in bootloader mode emits twice: once on\n * entering GetDeviceInfo, once on entering the waiting state.\n */\nconst bootloaderPollStates = (attempts: number): FlashMcuDAState[] =>\n Array.from({ length: attempts * 2 - 1 }, () =>\n pendingState(FlashMcuSteps.GetDeviceInfo),\n );\n\ndescribe(\"FlashMcuDeviceAction\", () => {\n const getOsVersionResponse = {\n isBootloader: true,\n isOsu: false,\n targetId: 0x01000001,\n seTargetId: 0x33200004,\n mcuTargetId: 0x01000001,\n seVersion: \"1.3.0\",\n seFlags: new Uint8Array([0xe6, 0x00, 0x00, 0x00]),\n mcuSephVersion: \"\",\n mcuBootloaderVersion: \"1.16\",\n hwVersion: \"00\",\n langId: 0,\n recoverState: undefined,\n secureElementFlags: {\n isPinValidated: true,\n hasMcuSerialNumber: true,\n hasValidCertificate: true,\n isCustomAuthorityConnectionAllowed: false,\n isSecureConnectionAllowed: false,\n isOnboarded: true,\n isMcuCodeSigned: true,\n isInRecoveryMode: false,\n hasEndorsementCertificateInSlot1: false,\n hasEndorsementCertificateInSlot2: false,\n numberOfWords: SeedWordCount.TwentyFour,\n currentWordIndex: 0,\n onboardingState: OnboardingState.Unknown,\n },\n } satisfies GetOsVersionResponse;\n\n const finalFirmware = {\n id: 300,\n version: \"1.4.0\",\n perso: \"perso\",\n firmware: \"final\",\n firmwareKey: \"final-key\",\n hash: \"final-hash\",\n bytes: 123,\n mcuVersions: [1],\n } satisfies FinalFirmware;\n\n type SecureChannelEvents = ReturnType<ReturnType<typeof flashMcu>>;\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n const setupGetOsVersion = (\n result: Either<unknown, GetOsVersionResponse> = Right(getOsVersionResponse),\n ) =>\n vi\n .mocked(getOsVersion)\n .mockReturnValue(\n () =>\n Promise.resolve(result) as ReturnType<\n ReturnType<typeof getOsVersion>\n >,\n );\n\n const setupGetOsVersionSequence = (\n results: Array<Either<unknown, GetOsVersionResponse>>,\n ) => {\n const remaining = [...results];\n vi.mocked(getOsVersion).mockReturnValue(\n () =>\n Promise.resolve(\n remaining.shift() ?? Right(getOsVersionResponse),\n ) as ReturnType<ReturnType<typeof getOsVersion>>,\n );\n };\n\n const setupResolveMcuVersion = (\n result: Either<unknown, ResolvedFlash> = Right({\n target: \"mcu\",\n version: \"1.12\",\n }),\n ) => {\n const handler = vi.fn().mockResolvedValue(result);\n vi.mocked(resolveMcuVersion).mockReturnValue(\n handler as unknown as ReturnType<typeof resolveMcuVersion>,\n );\n return handler;\n };\n\n const setupFlashMcu = (events: SecureChannelEvents = of()) => {\n const handler = vi.fn().mockReturnValue(events);\n vi.mocked(flashMcu).mockReturnValue(handler);\n return handler;\n };\n\n const makeDeviceAction = (\n input: FlashMcuDAInput = { mode: \"osUpdate\", finalFirmware },\n ) => new FlashMcuDeviceAction({ input });\n\n describe(\"Success\", () => {\n it(\"Should flash the MCU when the device is already in bootloader mode\", () =>\n new Promise<void>((resolve, reject) => {\n setupGetOsVersion();\n const resolveMcuVersionHandler = setupResolveMcuVersion();\n const flashMcuHandler = setupFlashMcu();\n\n const expectedStates: FlashMcuDAState[] = [\n pendingState(FlashMcuSteps.GetDeviceInfo),\n pendingState(FlashMcuSteps.ResolveMcuVersion),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n completedState(),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: () => {\n expect(resolveMcuVersionHandler).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n mode: \"osUpdate\",\n deviceInfo: getOsVersionResponse,\n finalFirmware,\n },\n }),\n );\n expect(flashMcuHandler).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n deviceInfo: getOsVersionResponse,\n version: \"1.12\",\n },\n }),\n );\n resolve();\n },\n onError: reject,\n },\n );\n }));\n\n it(\"Should report a bootloader flash when that is what was resolved\", () =>\n new Promise<void>((resolve, reject) => {\n setupGetOsVersion();\n setupResolveMcuVersion(Right({ target: \"bootloader\", version: \"0.6\" }));\n const flashMcuHandler = setupFlashMcu();\n\n const expectedStates: FlashMcuDAState[] = [\n pendingState(FlashMcuSteps.GetDeviceInfo),\n pendingState(FlashMcuSteps.ResolveMcuVersion),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n completedState(\"bootloader\"),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: () => {\n expect(flashMcuHandler).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n deviceInfo: getOsVersionResponse,\n version: \"0.6\",\n },\n }),\n );\n resolve();\n },\n onError: reject,\n },\n );\n }));\n\n it(\"Should flash the MCU in bootloader recovery mode without a final firmware\", () =>\n new Promise<void>((resolve, reject) => {\n setupGetOsVersion();\n const resolveMcuVersionHandler = setupResolveMcuVersion();\n const flashMcuHandler = setupFlashMcu();\n\n const expectedStates: FlashMcuDAState[] = [\n pendingState(FlashMcuSteps.GetDeviceInfo),\n pendingState(FlashMcuSteps.ResolveMcuVersion),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n completedState(),\n ];\n\n testDeviceActionStates(\n makeDeviceAction({ mode: \"bootloaderRecovery\" }),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: () => {\n expect(resolveMcuVersionHandler).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n mode: \"bootloaderRecovery\",\n deviceInfo: getOsVersionResponse,\n },\n }),\n );\n expect(flashMcuHandler).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n deviceInfo: getOsVersionResponse,\n version: \"1.12\",\n },\n }),\n );\n resolve();\n },\n onError: reject,\n },\n );\n }));\n\n it(\"Should poll until the device enters bootloader mode\", async () => {\n vi.useFakeTimers();\n setupGetOsVersionSequence([\n Right({ ...getOsVersionResponse, isBootloader: false }),\n Right({ ...getOsVersionResponse, isBootloader: false }),\n Right(getOsVersionResponse),\n ]);\n setupResolveMcuVersion();\n setupFlashMcu();\n\n const expectedStates: FlashMcuDAState[] = [\n ...bootloaderPollStates(3),\n pendingState(FlashMcuSteps.ResolveMcuVersion),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n completedState(),\n ];\n\n const done = new Promise<void>((resolve, reject) => {\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n });\n\n await vi.advanceTimersByTimeAsync(2000 * 3);\n await done;\n vi.useRealTimers();\n });\n\n it(\"Should report the flash progress\", () =>\n new Promise<void>((resolve, reject) => {\n setupGetOsVersion();\n setupResolveMcuVersion();\n setupFlashMcu(\n of(\n {\n type: SecureChannelEventType.Progress,\n payload: { progress: 0.5, index: 0, total: 2 },\n },\n {\n type: SecureChannelEventType.Progress,\n payload: { progress: 1, index: 1, total: 2 },\n },\n ) as SecureChannelEvents,\n );\n\n const expectedStates: FlashMcuDAState[] = [\n pendingState(FlashMcuSteps.GetDeviceInfo),\n pendingState(FlashMcuSteps.ResolveMcuVersion),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader, { progress: 0.5 }),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader, { progress: 1 }),\n completedState(),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n });\n\n describe(\"Error\", () => {\n it(\"Should go to Error when getOsVersion returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n const error = new GetOsVersionError(new Error(\"command failed\"));\n setupGetOsVersion(Left(error));\n\n const expectedStates: FlashMcuDAState[] = [\n pendingState(FlashMcuSteps.GetDeviceInfo),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"Should go to Error when the device never enters bootloader mode\", async () => {\n vi.useFakeTimers();\n setupGetOsVersion(\n Right({ ...getOsVersionResponse, isBootloader: false }),\n );\n\n const expectedStates: FlashMcuDAState[] = [\n ...bootloaderPollStates(10),\n errorState(\n new BootloaderModeTimeoutError(\n \"Device did not enter bootloader mode after 10 attempts\",\n ),\n ),\n ];\n\n const done = new Promise<void>((resolve, reject) => {\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n });\n\n await vi.advanceTimersByTimeAsync(2000 * 11);\n await done;\n vi.useRealTimers();\n });\n\n it(\"Should go to Error when resolveMcuVersion returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupGetOsVersion();\n const error = new ResolveMcuVersionError(\"no compatible MCU\");\n setupResolveMcuVersion(Left(error));\n\n const expectedStates: FlashMcuDAState[] = [\n pendingState(FlashMcuSteps.GetDeviceInfo),\n pendingState(FlashMcuSteps.ResolveMcuVersion),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"Should map a secure channel error event to a device action error\", () =>\n new Promise<void>((resolve, reject) => {\n setupGetOsVersion();\n setupResolveMcuVersion();\n setupFlashMcu(\n of({\n type: SecureChannelEventType.Error,\n error: new SecureChannelError(\"flash failed\"),\n }) as SecureChannelEvents,\n );\n\n const expectedStates: FlashMcuDAState[] = [\n pendingState(FlashMcuSteps.GetDeviceInfo),\n pendingState(FlashMcuSteps.ResolveMcuVersion),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n errorState(new UnknownDAError()),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"Should go to Error when the secure channel connection cannot be opened\", () =>\n new Promise<void>((resolve, reject) => {\n setupGetOsVersion();\n setupResolveMcuVersion();\n const error = new UnknownDAError(\"Invalid WebSocket connection\");\n setupFlashMcu(\n new Observable((subscriber) => {\n subscriber.error(error);\n }) as SecureChannelEvents,\n );\n\n const expectedStates: FlashMcuDAState[] = [\n pendingState(FlashMcuSteps.GetDeviceInfo),\n pendingState(FlashMcuSteps.ResolveMcuVersion),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n pendingState(FlashMcuSteps.FlashMcuOrBootloader),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["DeviceActionStatus", "OnboardingState", "SecureChannelError", "SecureChannelEventType", "SeedWordCount", "UnknownDAError", "UserInteractionRequired", "Left", "Right", "Observable", "of", "makeDeviceActionInternalApiMock", "testDeviceActionStates", "GetOsVersionError", "getOsVersion", "FlashMcuDeviceAction", "BootloaderModeTimeoutError", "ResolveMcuVersionError", "flashMcu", "resolveMcuVersion", "FlashMcuSteps", "pendingState", "step", "intermediateValue", "completedState", "target", "errorState", "error", "bootloaderPollStates", "attempts", "getOsVersionResponse", "finalFirmware", "setupGetOsVersion", "result", "setupGetOsVersionSequence", "results", "remaining", "setupResolveMcuVersion", "handler", "setupFlashMcu", "events", "makeDeviceAction", "input", "resolve", "reject", "resolveMcuVersionHandler", "flashMcuHandler", "expectedStates", "done", "subscriber"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{EitherAsync as a,Right as l}from"purify-ts";import{bestCompatibleMcu as v,bestMcuForBootloaderVersion as V,isSameBootloaderVersion as M}from"../../../../../device-action/OsUpdate/Shared/OsUpdateUtils";import{ResolveMcuVersionError as m}from"../../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors";const R=new Map([["0.0","0.6"]]),h=new Map([["0.0","0.6"],["0.6","1.5"],["0.7","1.6"],["0.9","1.7"]]),f=e=>{switch(e){case"osUpdate":return R;case"bootloaderRecovery":return h;default:return e}},p=e=>new m(e),g=e=>e.getManagerApiService().getMcuList().map(r=>r.map(o=>({id:o.id,name:o.name,fromBootloaderVersion:o.fromBootloaderVersion,providers:o.providers}))).mapLeft(p),E=e=>e.split(".").slice(0,2).join("."),w=(e,r,o)=>{const n=e.getManagerApiService(),t={...r,targetId:o};return n.getDeviceVersion(t).chain(s=>n.getFirmwareVersion(t,s)).map(s=>({id:s.id,perso:s.perso,version:s.version,bytes:s.bytes,firmware:s.firmware,firmwareKey:s.firmwareKey,hash:s.hash,mcuVersions:s.mcuVersions})).mapLeft(p)},y=(e,r)=>{switch(r.mode){case"osUpdate":return a.liftEither(l(r.finalFirmware));case"bootloaderRecovery":{const{seVersion:o,seTargetId:n}=r.deviceInfo;return o!==""&&n!==void 0?w(e,r.deviceInfo,n):a.liftEither(l(null))}default:return r}},b=e=>({input:r})=>{const{deviceInfo:o}=r,n=f(r.mode).get(E(o.mcuBootloaderVersion));return n!==void 0?Promise.resolve(l(n)):a(async({fromPromise:t,throwE:s})=>{const u=await t(g(e)),d=e.getManagerApiService().getProvider(),i=await t(y(e,r)),c=i?v(u,i,d):V(u,o.mcuBootloaderVersion,d);return c?M(c.fromBootloaderVersion,o.mcuBootloaderVersion)?c.name:c.fromBootloaderVersion:s(new m(i?`No MCU firmware compatible with the final firmware ${i.version}`:`No MCU firmware compatible with the bootloader version ${o.mcuBootloaderVersion}`))}).run()};export{b as resolveMcuVersion};
1
+ import{EitherAsync as c,Right as l}from"purify-ts";import{bestCompatibleMcu as p,bestMcuForBootloaderVersion as V,isSameBootloaderVersion as M}from"../../../../../device-action/OsUpdate/Shared/OsUpdateUtils";import{ResolveMcuVersionError as v}from"../../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors";const R=new Map([["0.0","0.6"]]),h=new Map([["0.0","0.6"],["0.6","1.5"],["0.7","1.6"],["0.9","1.7"]]),g=e=>{switch(e){case"osUpdate":return R;case"bootloaderRecovery":return h;default:return e}},m=e=>new v(e),f=e=>e.getManagerApiService().getMcuList().map(r=>r.map(o=>({id:o.id,name:o.name,fromBootloaderVersion:o.fromBootloaderVersion,providers:o.providers}))).mapLeft(m),E=e=>e.split(".").slice(0,2).join("."),w=(e,r,o)=>{const n=e.getManagerApiService(),t={...r,targetId:o};return n.getDeviceVersion(t).chain(s=>n.getFirmwareVersion(t,s)).map(s=>({id:s.id,perso:s.perso,version:s.version,bytes:s.bytes,firmware:s.firmware,firmwareKey:s.firmwareKey,hash:s.hash,mcuVersions:s.mcuVersions})).mapLeft(m)},y=(e,r)=>{switch(r.mode){case"osUpdate":return c.liftEither(l(r.finalFirmware));case"bootloaderRecovery":{const{seVersion:o,seTargetId:n}=r.deviceInfo;return o!==""&&n!==void 0?w(e,r.deviceInfo,n):c.liftEither(l(null))}default:return r}},b=e=>({input:r})=>{const{deviceInfo:o}=r,n=g(r.mode).get(E(o.mcuBootloaderVersion));return n!==void 0?Promise.resolve(l({target:"bootloader",version:n})):c(async({fromPromise:t,throwE:s})=>{const u=await t(f(e)),d=e.getManagerApiService().getProvider(),i=await t(y(e,r)),a=i?p(u,i,d):V(u,o.mcuBootloaderVersion,d);return a?M(a.fromBootloaderVersion,o.mcuBootloaderVersion)?{target:"mcu",version:a.name}:{target:"bootloader",version:a.fromBootloaderVersion}:s(new v(i?`No MCU firmware compatible with the final firmware ${i.version}`:`No MCU firmware compatible with the bootloader version ${o.mcuBootloaderVersion}`))}).run()};export{b as resolveMcuVersion};
2
2
  //# sourceMappingURL=ResolveMcuVersion.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../../src/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.ts"],
4
- "sourcesContent": ["import {\n type GetOsVersionResponse,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, EitherAsync, Right } from \"purify-ts\";\n\nimport {\n bestCompatibleMcu,\n bestMcuForBootloaderVersion,\n isSameBootloaderVersion,\n} from \"@api/device-action/OsUpdate/Shared/OsUpdateUtils\";\nimport {\n type FinalFirmware,\n type McuFirmware,\n} from \"@api/device-action/OsUpdate/Shared/types\";\nimport { ResolveMcuVersionError } from \"@api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors\";\nimport { type FlashMcuDAInput } from \"@api/device-action/OsUpdate/Update/FlashMcu/types\";\n\n/*\n * An OS update aims at a known firmware, so the MCU catalog can answer on its\n * own and the only bootloader it cannot answer for is one old enough to report\n * no version at all. A recovery has no firmware to constrain the catalog with,\n * so it also needs the hops that predate it.\n */\nconst OS_UPDATE_FORCED_MCU_VERSIONS = new Map([[\"0.0\", \"0.6\"]]);\n\nconst BOOTLOADER_RECOVERY_FORCED_MCU_VERSIONS = new Map([\n [\"0.0\", \"0.6\"],\n [\"0.6\", \"1.5\"],\n [\"0.7\", \"1.6\"],\n [\"0.9\", \"1.7\"],\n]);\n\nconst forcedMcuVersions = (\n mode: FlashMcuDAInput[\"mode\"],\n): Map<string, string> => {\n switch (mode) {\n case \"osUpdate\":\n return OS_UPDATE_FORCED_MCU_VERSIONS;\n case \"bootloaderRecovery\":\n return BOOTLOADER_RECOVERY_FORCED_MCU_VERSIONS;\n default: {\n const exhaustiveCheck: never = mode;\n return exhaustiveCheck;\n }\n }\n};\n\ntype ResolveMcuVersionHandlerArgs = {\n input: FlashMcuDAInput & {\n deviceInfo: GetOsVersionResponse;\n };\n};\n\ntype ResolveMcuVersionHandlerResponse = Promise<\n Either<ResolveMcuVersionError, string>\n>;\n\ntype ResolveMcuVersionHandler = (\n args: ResolveMcuVersionHandlerArgs,\n) => ResolveMcuVersionHandlerResponse;\n\nconst toResolveMcuVersionError = (error: unknown): ResolveMcuVersionError =>\n new ResolveMcuVersionError(error);\n\nconst getMcuList = (\n internalApi: InternalApi,\n): EitherAsync<ResolveMcuVersionError, McuFirmware[]> =>\n internalApi\n .getManagerApiService()\n .getMcuList()\n .map((mcuList) =>\n mcuList.map((mcu) => ({\n id: mcu.id,\n name: mcu.name,\n fromBootloaderVersion: mcu.fromBootloaderVersion,\n providers: mcu.providers,\n })),\n )\n .mapLeft(toResolveMcuVersionError);\n\n/*\n * The hop table is keyed on major.minor, while devices report anything from\n * \"0.0.0\" (bootloaders old enough to have no version field) to \"1.16\".\n */\nconst bootloaderMajorMinor = (bootloaderVersion: string): string =>\n bootloaderVersion.split(\".\").slice(0, 2).join(\".\");\n\n/*\n * A device in bootloader mode reports the MCU in `targetId`, but the catalog\n * lookups are about the secure element: both the device version and the\n * firmware version (which is read from `seVersion`) have to be resolved for the\n * SE target instead.\n */\nconst getSecureElementFinalFirmware = (\n internalApi: InternalApi,\n deviceInfo: GetOsVersionResponse,\n seTargetId: number,\n): EitherAsync<ResolveMcuVersionError, FinalFirmware> => {\n const managerApiService = internalApi.getManagerApiService();\n const secureElementDeviceInfo = { ...deviceInfo, targetId: seTargetId };\n\n return managerApiService\n .getDeviceVersion(secureElementDeviceInfo)\n .chain((deviceVersion) =>\n managerApiService.getFirmwareVersion(\n secureElementDeviceInfo,\n deviceVersion,\n ),\n )\n .map((finalFirmware) => ({\n id: finalFirmware.id,\n perso: finalFirmware.perso,\n version: finalFirmware.version,\n bytes: finalFirmware.bytes,\n firmware: finalFirmware.firmware,\n firmwareKey: finalFirmware.firmwareKey,\n hash: finalFirmware.hash,\n mcuVersions: finalFirmware.mcuVersions,\n }))\n .mapLeft(toResolveMcuVersionError);\n};\n\n/*\n * Returns null when there is no firmware to aim at, which only happens on a\n * device whose bootloader reports no secure element version.\n */\nconst getFinalFirmware = (\n internalApi: InternalApi,\n input: ResolveMcuVersionHandlerArgs[\"input\"],\n): EitherAsync<ResolveMcuVersionError, FinalFirmware | null> => {\n switch (input.mode) {\n case \"osUpdate\":\n return EitherAsync.liftEither(Right(input.finalFirmware));\n case \"bootloaderRecovery\": {\n const { seVersion, seTargetId } = input.deviceInfo;\n\n return seVersion !== \"\" && seTargetId !== undefined\n ? getSecureElementFinalFirmware(\n internalApi,\n input.deviceInfo,\n seTargetId,\n )\n : EitherAsync.liftEither(Right(null));\n }\n default: {\n const exhaustiveCheck: never = input;\n return exhaustiveCheck;\n }\n }\n};\n\nexport const resolveMcuVersion =\n (internalApi: InternalApi): ResolveMcuVersionHandler =>\n ({\n input,\n }: ResolveMcuVersionHandlerArgs): ResolveMcuVersionHandlerResponse => {\n const { deviceInfo } = input;\n const forcedVersion = forcedMcuVersions(input.mode).get(\n bootloaderMajorMinor(deviceInfo.mcuBootloaderVersion),\n );\n\n if (forcedVersion !== undefined) {\n return Promise.resolve(Right(forcedVersion));\n }\n\n return EitherAsync<ResolveMcuVersionError, string>(\n async ({ fromPromise, throwE }) => {\n const mcuList = await fromPromise(getMcuList(internalApi));\n const provider = internalApi.getManagerApiService().getProvider();\n const finalFirmware = await fromPromise(\n getFinalFirmware(internalApi, input),\n );\n const mcu = finalFirmware\n ? bestCompatibleMcu(mcuList, finalFirmware, provider)\n : bestMcuForBootloaderVersion(\n mcuList,\n deviceInfo.mcuBootloaderVersion,\n provider,\n );\n\n if (!mcu) {\n return throwE(\n new ResolveMcuVersionError(\n finalFirmware\n ? `No MCU firmware compatible with the final firmware ${finalFirmware.version}`\n : `No MCU firmware compatible with the bootloader version ${deviceInfo.mcuBootloaderVersion}`,\n ),\n );\n }\n\n // A bootloader that is not yet at the MCU's starting point must be\n // upgraded to that bootloader version before the MCU itself can be flashed.\n return isSameBootloaderVersion(\n mcu.fromBootloaderVersion,\n deviceInfo.mcuBootloaderVersion,\n )\n ? mcu.name\n : mcu.fromBootloaderVersion;\n },\n ).run();\n };\n"],
5
- "mappings": "AAIA,OAAsB,eAAAA,EAAa,SAAAC,MAAa,YAEhD,OACE,qBAAAC,EACA,+BAAAC,EACA,2BAAAC,MACK,mDAKP,OAAS,0BAAAC,MAA8B,yEASvC,MAAMC,EAAgC,IAAI,IAAI,CAAC,CAAC,MAAO,KAAK,CAAC,CAAC,EAExDC,EAA0C,IAAI,IAAI,CACtD,CAAC,MAAO,KAAK,EACb,CAAC,MAAO,KAAK,EACb,CAAC,MAAO,KAAK,EACb,CAAC,MAAO,KAAK,CACf,CAAC,EAEKC,EACJC,GACwB,CACxB,OAAQA,EAAM,CACZ,IAAK,WACH,OAAOH,EACT,IAAK,qBACH,OAAOC,EACT,QAEE,OAD+BE,CAGnC,CACF,EAgBMC,EAA4BC,GAChC,IAAIN,EAAuBM,CAAK,EAE5BC,EACJC,GAEAA,EACG,qBAAqB,EACrB,WAAW,EACX,IAAKC,GACJA,EAAQ,IAAKC,IAAS,CACpB,GAAIA,EAAI,GACR,KAAMA,EAAI,KACV,sBAAuBA,EAAI,sBAC3B,UAAWA,EAAI,SACjB,EAAE,CACJ,EACC,QAAQL,CAAwB,EAM/BM,EAAwBC,GAC5BA,EAAkB,MAAM,GAAG,EAAE,MAAM,EAAG,CAAC,EAAE,KAAK,GAAG,EAQ7CC,EAAgC,CACpCL,EACAM,EACAC,IACuD,CACvD,MAAMC,EAAoBR,EAAY,qBAAqB,EACrDS,EAA0B,CAAE,GAAGH,EAAY,SAAUC,CAAW,EAEtE,OAAOC,EACJ,iBAAiBC,CAAuB,EACxC,MAAOC,GACNF,EAAkB,mBAChBC,EACAC,CACF,CACF,EACC,IAAKC,IAAmB,CACvB,GAAIA,EAAc,GAClB,MAAOA,EAAc,MACrB,QAASA,EAAc,QACvB,MAAOA,EAAc,MACrB,SAAUA,EAAc,SACxB,YAAaA,EAAc,YAC3B,KAAMA,EAAc,KACpB,YAAaA,EAAc,WAC7B,EAAE,EACD,QAAQd,CAAwB,CACrC,EAMMe,EAAmB,CACvBZ,EACAa,IAC8D,CAC9D,OAAQA,EAAM,KAAM,CAClB,IAAK,WACH,OAAO1B,EAAY,WAAWC,EAAMyB,EAAM,aAAa,CAAC,EAC1D,IAAK,qBAAsB,CACzB,KAAM,CAAE,UAAAC,EAAW,WAAAP,CAAW,EAAIM,EAAM,WAExC,OAAOC,IAAc,IAAMP,IAAe,OACtCF,EACEL,EACAa,EAAM,WACNN,CACF,EACApB,EAAY,WAAWC,EAAM,IAAI,CAAC,CACxC,CACA,QAEE,OAD+ByB,CAGnC,CACF,EAEaE,EACVf,GACD,CAAC,CACC,MAAAa,CACF,IAAsE,CACpE,KAAM,CAAE,WAAAP,CAAW,EAAIO,EACjBG,EAAgBrB,EAAkBkB,EAAM,IAAI,EAAE,IAClDV,EAAqBG,EAAW,oBAAoB,CACtD,EAEA,OAAIU,IAAkB,OACb,QAAQ,QAAQ5B,EAAM4B,CAAa,CAAC,EAGtC7B,EACL,MAAO,CAAE,YAAA8B,EAAa,OAAAC,CAAO,IAAM,CACjC,MAAMjB,EAAU,MAAMgB,EAAYlB,EAAWC,CAAW,CAAC,EACnDmB,EAAWnB,EAAY,qBAAqB,EAAE,YAAY,EAC1DW,EAAgB,MAAMM,EAC1BL,EAAiBZ,EAAaa,CAAK,CACrC,EACMX,EAAMS,EACRtB,EAAkBY,EAASU,EAAeQ,CAAQ,EAClD7B,EACEW,EACAK,EAAW,qBACXa,CACF,EAEJ,OAAKjB,EAYEX,EACLW,EAAI,sBACJI,EAAW,oBACb,EACIJ,EAAI,KACJA,EAAI,sBAhBCgB,EACL,IAAI1B,EACFmB,EACI,sDAAsDA,EAAc,OAAO,GAC3E,0DAA0DL,EAAW,oBAAoB,EAC/F,CACF,CAWJ,CACF,EAAE,IAAI,CACR",
4
+ "sourcesContent": ["import {\n type GetOsVersionResponse,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, EitherAsync, Right } from \"purify-ts\";\n\nimport {\n bestCompatibleMcu,\n bestMcuForBootloaderVersion,\n isSameBootloaderVersion,\n} from \"@api/device-action/OsUpdate/Shared/OsUpdateUtils\";\nimport {\n type FinalFirmware,\n type McuFirmware,\n} from \"@api/device-action/OsUpdate/Shared/types\";\nimport { ResolveMcuVersionError } from \"@api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors\";\nimport {\n type FlashMcuDAInput,\n type ResolvedFlash,\n} from \"@api/device-action/OsUpdate/Update/FlashMcu/types\";\n\n/*\n * An OS update aims at a known firmware, so the MCU catalog can answer on its\n * own and the only bootloader it cannot answer for is one old enough to report\n * no version at all. A recovery has no firmware to constrain the catalog with,\n * so it also needs the hops that predate it.\n */\nconst OS_UPDATE_FORCED_MCU_VERSIONS = new Map([[\"0.0\", \"0.6\"]]);\n\nconst BOOTLOADER_RECOVERY_FORCED_MCU_VERSIONS = new Map([\n [\"0.0\", \"0.6\"],\n [\"0.6\", \"1.5\"],\n [\"0.7\", \"1.6\"],\n [\"0.9\", \"1.7\"],\n]);\n\nconst forcedMcuVersions = (\n mode: FlashMcuDAInput[\"mode\"],\n): Map<string, string> => {\n switch (mode) {\n case \"osUpdate\":\n return OS_UPDATE_FORCED_MCU_VERSIONS;\n case \"bootloaderRecovery\":\n return BOOTLOADER_RECOVERY_FORCED_MCU_VERSIONS;\n default: {\n const exhaustiveCheck: never = mode;\n return exhaustiveCheck;\n }\n }\n};\n\ntype ResolveMcuVersionHandlerArgs = {\n input: FlashMcuDAInput & {\n deviceInfo: GetOsVersionResponse;\n };\n};\n\ntype ResolveMcuVersionHandlerResponse = Promise<\n Either<ResolveMcuVersionError, ResolvedFlash>\n>;\n\ntype ResolveMcuVersionHandler = (\n args: ResolveMcuVersionHandlerArgs,\n) => ResolveMcuVersionHandlerResponse;\n\nconst toResolveMcuVersionError = (error: unknown): ResolveMcuVersionError =>\n new ResolveMcuVersionError(error);\n\nconst getMcuList = (\n internalApi: InternalApi,\n): EitherAsync<ResolveMcuVersionError, McuFirmware[]> =>\n internalApi\n .getManagerApiService()\n .getMcuList()\n .map((mcuList) =>\n mcuList.map((mcu) => ({\n id: mcu.id,\n name: mcu.name,\n fromBootloaderVersion: mcu.fromBootloaderVersion,\n providers: mcu.providers,\n })),\n )\n .mapLeft(toResolveMcuVersionError);\n\n/*\n * The hop table is keyed on major.minor, while devices report anything from\n * \"0.0.0\" (bootloaders old enough to have no version field) to \"1.16\".\n */\nconst bootloaderMajorMinor = (bootloaderVersion: string): string =>\n bootloaderVersion.split(\".\").slice(0, 2).join(\".\");\n\n/*\n * A device in bootloader mode reports the MCU in `targetId`, but the catalog\n * lookups are about the secure element: both the device version and the\n * firmware version (which is read from `seVersion`) have to be resolved for the\n * SE target instead.\n */\nconst getSecureElementFinalFirmware = (\n internalApi: InternalApi,\n deviceInfo: GetOsVersionResponse,\n seTargetId: number,\n): EitherAsync<ResolveMcuVersionError, FinalFirmware> => {\n const managerApiService = internalApi.getManagerApiService();\n const secureElementDeviceInfo = { ...deviceInfo, targetId: seTargetId };\n\n return managerApiService\n .getDeviceVersion(secureElementDeviceInfo)\n .chain((deviceVersion) =>\n managerApiService.getFirmwareVersion(\n secureElementDeviceInfo,\n deviceVersion,\n ),\n )\n .map((finalFirmware) => ({\n id: finalFirmware.id,\n perso: finalFirmware.perso,\n version: finalFirmware.version,\n bytes: finalFirmware.bytes,\n firmware: finalFirmware.firmware,\n firmwareKey: finalFirmware.firmwareKey,\n hash: finalFirmware.hash,\n mcuVersions: finalFirmware.mcuVersions,\n }))\n .mapLeft(toResolveMcuVersionError);\n};\n\n/*\n * Returns null when there is no firmware to aim at, which only happens on a\n * device whose bootloader reports no secure element version.\n */\nconst getFinalFirmware = (\n internalApi: InternalApi,\n input: ResolveMcuVersionHandlerArgs[\"input\"],\n): EitherAsync<ResolveMcuVersionError, FinalFirmware | null> => {\n switch (input.mode) {\n case \"osUpdate\":\n return EitherAsync.liftEither(Right(input.finalFirmware));\n case \"bootloaderRecovery\": {\n const { seVersion, seTargetId } = input.deviceInfo;\n\n return seVersion !== \"\" && seTargetId !== undefined\n ? getSecureElementFinalFirmware(\n internalApi,\n input.deviceInfo,\n seTargetId,\n )\n : EitherAsync.liftEither(Right(null));\n }\n default: {\n const exhaustiveCheck: never = input;\n return exhaustiveCheck;\n }\n }\n};\n\nexport const resolveMcuVersion =\n (internalApi: InternalApi): ResolveMcuVersionHandler =>\n ({\n input,\n }: ResolveMcuVersionHandlerArgs): ResolveMcuVersionHandlerResponse => {\n const { deviceInfo } = input;\n const forcedVersion = forcedMcuVersions(input.mode).get(\n bootloaderMajorMinor(deviceInfo.mcuBootloaderVersion),\n );\n\n if (forcedVersion !== undefined) {\n return Promise.resolve(\n Right({ target: \"bootloader\", version: forcedVersion }),\n );\n }\n\n return EitherAsync<ResolveMcuVersionError, ResolvedFlash>(\n async ({ fromPromise, throwE }) => {\n const mcuList = await fromPromise(getMcuList(internalApi));\n const provider = internalApi.getManagerApiService().getProvider();\n const finalFirmware = await fromPromise(\n getFinalFirmware(internalApi, input),\n );\n const mcu = finalFirmware\n ? bestCompatibleMcu(mcuList, finalFirmware, provider)\n : bestMcuForBootloaderVersion(\n mcuList,\n deviceInfo.mcuBootloaderVersion,\n provider,\n );\n\n if (!mcu) {\n return throwE(\n new ResolveMcuVersionError(\n finalFirmware\n ? `No MCU firmware compatible with the final firmware ${finalFirmware.version}`\n : `No MCU firmware compatible with the bootloader version ${deviceInfo.mcuBootloaderVersion}`,\n ),\n );\n }\n\n // A bootloader that is not yet at the MCU's starting point must be\n // upgraded to that bootloader version before the MCU itself can be flashed.\n return isSameBootloaderVersion(\n mcu.fromBootloaderVersion,\n deviceInfo.mcuBootloaderVersion,\n )\n ? { target: \"mcu\", version: mcu.name }\n : { target: \"bootloader\", version: mcu.fromBootloaderVersion };\n },\n ).run();\n };\n"],
5
+ "mappings": "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",
6
6
  "names": ["EitherAsync", "Right", "bestCompatibleMcu", "bestMcuForBootloaderVersion", "isSameBootloaderVersion", "ResolveMcuVersionError", "OS_UPDATE_FORCED_MCU_VERSIONS", "BOOTLOADER_RECOVERY_FORCED_MCU_VERSIONS", "forcedMcuVersions", "mode", "toResolveMcuVersionError", "error", "getMcuList", "internalApi", "mcuList", "mcu", "bootloaderMajorMinor", "bootloaderVersion", "getSecureElementFinalFirmware", "deviceInfo", "seTargetId", "managerApiService", "secureElementDeviceInfo", "deviceVersion", "finalFirmware", "getFinalFirmware", "input", "seVersion", "resolveMcuVersion", "forcedVersion", "fromPromise", "throwE", "provider"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{OnboardingState as w,SeedWordCount as g}from"@ledgerhq/device-management-kit";import{EitherAsync as c}from"purify-ts";import{makeDeviceActionInternalApiMock as x}from"../../../../../device-action/__test-utils__/makeInternalApi";import{ResolveMcuVersionError as u}from"../../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors";import{resolveMcuVersion as n}from"../../../../../device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion";describe("ResolveMcuVersion",()=>{const r=x(),{getManagerApiService:v}=r,t={isBootloader:!0,isOsu:!1,targetId:16777217,seTargetId:857735172,mcuTargetId:16777217,seVersion:"1.3.0",seFlags:new Uint8Array([230,0,0,0]),mcuSephVersion:"",mcuBootloaderVersion:"1.16",hwVersion:"00",langId:0,recoverState:void 0,secureElementFlags:{isPinValidated:!0,hasMcuSerialNumber:!0,hasValidCertificate:!0,isCustomAuthorityConnectionAllowed:!1,isSecureConnectionAllowed:!1,isOnboarded:!0,isMcuCodeSigned:!0,isInRecoveryMode:!1,hasEndorsementCertificateInSlot1:!1,hasEndorsementCertificateInSlot2:!1,numberOfWords:g.TwentyFour,currentWordIndex:0,onboardingState:w.Unknown}},a={id:300,version:"1.4.0",perso:"perso",firmware:"final",firmwareKey:"final-key",hash:"final-hash",bytes:123,mcuVersions:[1,2]},m={id:17},p=vi.fn(),h=vi.fn(),d=vi.fn(),l=vi.fn();beforeEach(()=>{vi.resetAllMocks(),h.mockReturnValue(1),v.mockReturnValue({getMcuList:p,getProvider:h,getDeviceVersion:d,getFirmwareVersion:l})});const i=e=>p.mockReturnValue(c(()=>Promise.resolve(e))),V=e=>{d.mockReturnValue(c(()=>Promise.resolve(m))),l.mockReturnValue(c(()=>Promise.resolve(e)))};describe("Success",()=>{it.each([["0.0"],["0.0.0"]])("Should force the MCU version of a bootloader reporting %s without fetching the MCU list",async e=>{const o=await n(r)({input:{mode:"osUpdate",deviceInfo:{...t,mcuBootloaderVersion:e},finalFirmware:a}});expect(o.extract()).toBe("0.6"),expect(v).not.toHaveBeenCalled()}),it.each([["0.6"],["0.7"],["0.9"]])("Should resolve a bootloader reporting %s from the catalog rather than from the recovery hops",async e=>{i([{id:1,name:"1.12",fromBootloaderVersion:e,providers:[1]}]);const o=await n(r)({input:{mode:"osUpdate",deviceInfo:{...t,mcuBootloaderVersion:e},finalFirmware:a}});expect(o.extract()).toBe("1.12"),expect(p).toHaveBeenCalled()}),it("Should return the MCU name when the device is already at its starting bootloader version",async()=>{h.mockReturnValue(12),i([{id:1,name:"1.12",fromBootloaderVersion:"1.16",providers:[12]}]);const e=await n(r)({input:{mode:"osUpdate",deviceInfo:t,finalFirmware:a}});expect(e.extract()).toBe("1.12")}),it("Should ignore the number of segments when comparing bootloader versions",async()=>{i([{id:1,name:"1.12",fromBootloaderVersion:"1.16.0",providers:[1]}]);const e=await n(r)({input:{mode:"osUpdate",deviceInfo:t,finalFirmware:a}});expect(e.extract()).toBe("1.12")}),it("Should return the starting bootloader version when the device is not on it yet",async()=>{i([{id:1,name:"1.12",fromBootloaderVersion:"1.17",providers:[1]}]);const e=await n(r)({input:{mode:"osUpdate",deviceInfo:t,finalFirmware:a}});expect(e.extract()).toBe("1.17")}),it("Should pick the highest MCU version compatible with the final firmware",async()=>{i([{id:1,name:"1.11",fromBootloaderVersion:"1.16",providers:[1]},{id:2,name:"1.12",fromBootloaderVersion:"1.16",providers:[1]},{id:3,name:"1.13",fromBootloaderVersion:"1.16",providers:[1]}]);const e=await n(r)({input:{mode:"osUpdate",deviceInfo:t,finalFirmware:a}});expect(e.extract()).toBe("1.12")})}),describe("Bootloader recovery",()=>{const e={...t,seVersion:"",seTargetId:void 0};it.each([["0.0","0.6"],["0.0.0","0.6"],["0.6","1.5"],["0.7","1.6"],["0.9","1.7"]])("Should force the MCU version to %s => %s without reaching the Manager API",async(o,s)=>{const f=await n(r)({input:{mode:"bootloaderRecovery",deviceInfo:{...t,mcuBootloaderVersion:o}}});expect(f.extract()).toBe(s),expect(v).not.toHaveBeenCalled()}),it("Should resolve the final firmware of the secure element, not of the MCU",async()=>{i([{id:1,name:"1.12",fromBootloaderVersion:"1.16",providers:[1]}]),V(a);const o=await n(r)({input:{mode:"bootloaderRecovery",deviceInfo:t}});expect(o.extract()).toBe("1.12"),expect(d).toHaveBeenCalledWith(expect.objectContaining({targetId:t.seTargetId,seVersion:t.seVersion})),expect(l).toHaveBeenCalledWith(expect.objectContaining({targetId:t.seTargetId,seVersion:t.seVersion}),m)}),it("Should fall back to the bootloader version when the device reports no secure element firmware",async()=>{i([{id:1,name:"1.11",fromBootloaderVersion:"1.16",providers:[1]},{id:2,name:"1.12",fromBootloaderVersion:"1.16",providers:[1]},{id:3,name:"1.13",fromBootloaderVersion:"1.17",providers:[1]}]);const o=await n(r)({input:{mode:"bootloaderRecovery",deviceInfo:e}});expect(o.extract()).toBe("1.12"),expect(d).not.toHaveBeenCalled()}),it("Should ignore MCU firmwares of another provider in the fallback",async()=>{i([{id:1,name:"1.12",fromBootloaderVersion:"1.16",providers:[12]}]);const o=await n(r)({input:{mode:"bootloaderRecovery",deviceInfo:e}});expect(o.isLeft()).toBe(!0),o.mapLeft(s=>{expect(s).toBeInstanceOf(u)})}),it("Should return a ResolveMcuVersionError when the MCU list is empty",async()=>{i([]),V(a);const o=await n(r)({input:{mode:"bootloaderRecovery",deviceInfo:t}});expect(o.isLeft()).toBe(!0),o.mapLeft(s=>{expect(s).toBeInstanceOf(u)})}),it("Should return a ResolveMcuVersionError when the secure element firmware is unknown",async()=>{const o=new Error("not found");i([{id:1,name:"1.12",fromBootloaderVersion:"1.16",providers:[1]}]),d.mockReturnValue(c(()=>Promise.resolve(m))),l.mockReturnValue(c(()=>Promise.reject(o)));const s=await n(r)({input:{mode:"bootloaderRecovery",deviceInfo:{...t,seVersion:"2.2.3-osu"}}});expect(l).toHaveBeenCalledWith(expect.objectContaining({seVersion:"2.2.3-osu"}),m),expect(s.isLeft()).toBe(!0),s.mapLeft(f=>{expect(f).toBeInstanceOf(u),expect(f.originalError).toBe(o)})})}),describe("Error",()=>{it("Should return a ResolveMcuVersionError when the MCU list cannot be fetched",async()=>{const e=new Error("network failure");p.mockReturnValue(c(()=>Promise.reject(e)));const o=await n(r)({input:{mode:"osUpdate",deviceInfo:t,finalFirmware:a}});expect(o.isLeft()).toBe(!0),o.mapLeft(s=>{expect(s).toBeInstanceOf(u),expect(s.originalError).toBe(e)})}),it("Should return a ResolveMcuVersionError when no compatible MCU is found",async()=>{i([{id:99,name:"1.12",fromBootloaderVersion:"1.16",providers:[1]}]);const e=await n(r)({input:{mode:"osUpdate",deviceInfo:t,finalFirmware:a}});expect(e.isLeft()).toBe(!0),e.mapLeft(o=>{expect(o).toBeInstanceOf(u)})})})});
1
+ import{OnboardingState as V,SeedWordCount as w}from"@ledgerhq/device-management-kit";import{EitherAsync as c}from"purify-ts";import{makeDeviceActionInternalApiMock as x}from"../../../../../device-action/__test-utils__/makeInternalApi";import{ResolveMcuVersionError as u}from"../../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors";import{resolveMcuVersion as n}from"../../../../../device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion";describe("ResolveMcuVersion",()=>{const r=x(),{getManagerApiService:v}=r,t={isBootloader:!0,isOsu:!1,targetId:16777217,seTargetId:857735172,mcuTargetId:16777217,seVersion:"1.3.0",seFlags:new Uint8Array([230,0,0,0]),mcuSephVersion:"",mcuBootloaderVersion:"1.16",hwVersion:"00",langId:0,recoverState:void 0,secureElementFlags:{isPinValidated:!0,hasMcuSerialNumber:!0,hasValidCertificate:!0,isCustomAuthorityConnectionAllowed:!1,isSecureConnectionAllowed:!1,isOnboarded:!0,isMcuCodeSigned:!0,isInRecoveryMode:!1,hasEndorsementCertificateInSlot1:!1,hasEndorsementCertificateInSlot2:!1,numberOfWords:w.TwentyFour,currentWordIndex:0,onboardingState:V.Unknown}},a={id:300,version:"1.4.0",perso:"perso",firmware:"final",firmwareKey:"final-key",hash:"final-hash",bytes:123,mcuVersions:[1,2]},m={id:17},p=vi.fn(),h=vi.fn(),d=vi.fn(),l=vi.fn();beforeEach(()=>{vi.resetAllMocks(),h.mockReturnValue(1),v.mockReturnValue({getMcuList:p,getProvider:h,getDeviceVersion:d,getFirmwareVersion:l})});const i=e=>p.mockReturnValue(c(()=>Promise.resolve(e))),g=e=>{d.mockReturnValue(c(()=>Promise.resolve(m))),l.mockReturnValue(c(()=>Promise.resolve(e)))};describe("Success",()=>{it.each([["0.0"],["0.0.0"]])("Should force the MCU version of a bootloader reporting %s without fetching the MCU list",async e=>{const o=await n(r)({input:{mode:"osUpdate",deviceInfo:{...t,mcuBootloaderVersion:e},finalFirmware:a}});expect(o.extract()).toEqual({target:"bootloader",version:"0.6"}),expect(v).not.toHaveBeenCalled()}),it.each([["0.6"],["0.7"],["0.9"]])("Should resolve a bootloader reporting %s from the catalog rather than from the recovery hops",async e=>{i([{id:1,name:"1.12",fromBootloaderVersion:e,providers:[1]}]);const o=await n(r)({input:{mode:"osUpdate",deviceInfo:{...t,mcuBootloaderVersion:e},finalFirmware:a}});expect(o.extract()).toEqual({target:"mcu",version:"1.12"}),expect(p).toHaveBeenCalled()}),it("Should return the MCU name when the device is already at its starting bootloader version",async()=>{h.mockReturnValue(12),i([{id:1,name:"1.12",fromBootloaderVersion:"1.16",providers:[12]}]);const e=await n(r)({input:{mode:"osUpdate",deviceInfo:t,finalFirmware:a}});expect(e.extract()).toEqual({target:"mcu",version:"1.12"})}),it("Should ignore the number of segments when comparing bootloader versions",async()=>{i([{id:1,name:"1.12",fromBootloaderVersion:"1.16.0",providers:[1]}]);const e=await n(r)({input:{mode:"osUpdate",deviceInfo:t,finalFirmware:a}});expect(e.extract()).toEqual({target:"mcu",version:"1.12"})}),it("Should return the starting bootloader version when the device is not on it yet",async()=>{i([{id:1,name:"1.12",fromBootloaderVersion:"1.17",providers:[1]}]);const e=await n(r)({input:{mode:"osUpdate",deviceInfo:t,finalFirmware:a}});expect(e.extract()).toEqual({target:"bootloader",version:"1.17"})}),it("Should pick the highest MCU version compatible with the final firmware",async()=>{i([{id:1,name:"1.11",fromBootloaderVersion:"1.16",providers:[1]},{id:2,name:"1.12",fromBootloaderVersion:"1.16",providers:[1]},{id:3,name:"1.13",fromBootloaderVersion:"1.16",providers:[1]}]);const e=await n(r)({input:{mode:"osUpdate",deviceInfo:t,finalFirmware:a}});expect(e.extract()).toEqual({target:"mcu",version:"1.12"})})}),describe("Bootloader recovery",()=>{const e={...t,seVersion:"",seTargetId:void 0};it.each([["0.0","0.6"],["0.0.0","0.6"],["0.6","1.5"],["0.7","1.6"],["0.9","1.7"]])("Should force the MCU version to %s => %s without reaching the Manager API",async(o,s)=>{const f=await n(r)({input:{mode:"bootloaderRecovery",deviceInfo:{...t,mcuBootloaderVersion:o}}});expect(f.extract()).toEqual({target:"bootloader",version:s}),expect(v).not.toHaveBeenCalled()}),it("Should resolve the final firmware of the secure element, not of the MCU",async()=>{i([{id:1,name:"1.12",fromBootloaderVersion:"1.16",providers:[1]}]),g(a);const o=await n(r)({input:{mode:"bootloaderRecovery",deviceInfo:t}});expect(o.extract()).toEqual({target:"mcu",version:"1.12"}),expect(d).toHaveBeenCalledWith(expect.objectContaining({targetId:t.seTargetId,seVersion:t.seVersion})),expect(l).toHaveBeenCalledWith(expect.objectContaining({targetId:t.seTargetId,seVersion:t.seVersion}),m)}),it("Should fall back to the bootloader version when the device reports no secure element firmware",async()=>{i([{id:1,name:"1.11",fromBootloaderVersion:"1.16",providers:[1]},{id:2,name:"1.12",fromBootloaderVersion:"1.16",providers:[1]},{id:3,name:"1.13",fromBootloaderVersion:"1.17",providers:[1]}]);const o=await n(r)({input:{mode:"bootloaderRecovery",deviceInfo:e}});expect(o.extract()).toEqual({target:"mcu",version:"1.12"}),expect(d).not.toHaveBeenCalled()}),it("Should ignore MCU firmwares of another provider in the fallback",async()=>{i([{id:1,name:"1.12",fromBootloaderVersion:"1.16",providers:[12]}]);const o=await n(r)({input:{mode:"bootloaderRecovery",deviceInfo:e}});expect(o.isLeft()).toBe(!0),o.mapLeft(s=>{expect(s).toBeInstanceOf(u)})}),it("Should return a ResolveMcuVersionError when the MCU list is empty",async()=>{i([]),g(a);const o=await n(r)({input:{mode:"bootloaderRecovery",deviceInfo:t}});expect(o.isLeft()).toBe(!0),o.mapLeft(s=>{expect(s).toBeInstanceOf(u)})}),it("Should return a ResolveMcuVersionError when the secure element firmware is unknown",async()=>{const o=new Error("not found");i([{id:1,name:"1.12",fromBootloaderVersion:"1.16",providers:[1]}]),d.mockReturnValue(c(()=>Promise.resolve(m))),l.mockReturnValue(c(()=>Promise.reject(o)));const s=await n(r)({input:{mode:"bootloaderRecovery",deviceInfo:{...t,seVersion:"2.2.3-osu"}}});expect(l).toHaveBeenCalledWith(expect.objectContaining({seVersion:"2.2.3-osu"}),m),expect(s.isLeft()).toBe(!0),s.mapLeft(f=>{expect(f).toBeInstanceOf(u),expect(f.originalError).toBe(o)})})}),describe("Error",()=>{it("Should return a ResolveMcuVersionError when the MCU list cannot be fetched",async()=>{const e=new Error("network failure");p.mockReturnValue(c(()=>Promise.reject(e)));const o=await n(r)({input:{mode:"osUpdate",deviceInfo:t,finalFirmware:a}});expect(o.isLeft()).toBe(!0),o.mapLeft(s=>{expect(s).toBeInstanceOf(u),expect(s.originalError).toBe(e)})}),it("Should return a ResolveMcuVersionError when no compatible MCU is found",async()=>{i([{id:99,name:"1.12",fromBootloaderVersion:"1.16",providers:[1]}]);const e=await n(r)({input:{mode:"osUpdate",deviceInfo:t,finalFirmware:a}});expect(e.isLeft()).toBe(!0),e.mapLeft(o=>{expect(o).toBeInstanceOf(u)})})})});
2
2
  //# sourceMappingURL=ResolveMcuVersion.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../../src/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.ts"],
4
- "sourcesContent": ["import {\n type GetOsVersionResponse,\n type InternalApi,\n OnboardingState,\n SeedWordCount,\n} from \"@ledgerhq/device-management-kit\";\nimport { EitherAsync } from \"purify-ts\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { type FinalFirmware } from \"@api/device-action/OsUpdate/Shared/types\";\nimport { ResolveMcuVersionError } from \"@api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors\";\nimport { resolveMcuVersion } from \"@api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion\";\n\ndescribe(\"ResolveMcuVersion\", () => {\n const DEFAULT_MANAGER_API_PROVIDER = 1;\n const apiMock = makeDeviceActionInternalApiMock();\n const { getManagerApiService: getManagerApiServiceMock } = apiMock;\n\n const deviceInfo = {\n isBootloader: true,\n isOsu: false,\n targetId: 0x01000001,\n seTargetId: 0x33200004,\n mcuTargetId: 0x01000001,\n seVersion: \"1.3.0\",\n seFlags: new Uint8Array([0xe6, 0x00, 0x00, 0x00]),\n mcuSephVersion: \"\",\n mcuBootloaderVersion: \"1.16\",\n hwVersion: \"00\",\n langId: 0,\n recoverState: undefined,\n secureElementFlags: {\n isPinValidated: true,\n hasMcuSerialNumber: true,\n hasValidCertificate: true,\n isCustomAuthorityConnectionAllowed: false,\n isSecureConnectionAllowed: false,\n isOnboarded: true,\n isMcuCodeSigned: true,\n isInRecoveryMode: false,\n hasEndorsementCertificateInSlot1: false,\n hasEndorsementCertificateInSlot2: false,\n numberOfWords: SeedWordCount.TwentyFour,\n currentWordIndex: 0,\n onboardingState: OnboardingState.Unknown,\n },\n } satisfies GetOsVersionResponse;\n\n const finalFirmware = {\n id: 300,\n version: \"1.4.0\",\n perso: \"perso\",\n firmware: \"final\",\n firmwareKey: \"final-key\",\n hash: \"final-hash\",\n bytes: 123,\n mcuVersions: [1, 2],\n } satisfies FinalFirmware;\n\n const deviceVersion = { id: 17 };\n\n const getMcuListMock = vi.fn();\n const getProviderMock = vi.fn();\n const getDeviceVersionMock = vi.fn();\n const getFirmwareVersionMock = vi.fn();\n\n beforeEach(() => {\n vi.resetAllMocks();\n getProviderMock.mockReturnValue(DEFAULT_MANAGER_API_PROVIDER);\n getManagerApiServiceMock.mockReturnValue({\n getMcuList: getMcuListMock,\n getProvider: getProviderMock,\n getDeviceVersion: getDeviceVersionMock,\n getFirmwareVersion: getFirmwareVersionMock,\n } as unknown as ReturnType<InternalApi[\"getManagerApiService\"]>);\n });\n\n const setupMcuList = (\n mcus: Array<{\n id: number;\n name: string;\n fromBootloaderVersion: string;\n providers: number[];\n }>,\n ) => getMcuListMock.mockReturnValue(EitherAsync(() => Promise.resolve(mcus)));\n\n const setupSecureElementFirmware = (firmware: FinalFirmware) => {\n getDeviceVersionMock.mockReturnValue(\n EitherAsync(() => Promise.resolve(deviceVersion)),\n );\n getFirmwareVersionMock.mockReturnValue(\n EitherAsync(() => Promise.resolve(firmware)),\n );\n };\n\n describe(\"Success\", () => {\n it.each([[\"0.0\"], [\"0.0.0\"]])(\n \"Should force the MCU version of a bootloader reporting %s without fetching the MCU list\",\n async (mcuBootloaderVersion) => {\n const result = await resolveMcuVersion(apiMock)({\n input: {\n mode: \"osUpdate\",\n deviceInfo: { ...deviceInfo, mcuBootloaderVersion },\n finalFirmware,\n },\n });\n\n expect(result.extract()).toBe(\"0.6\");\n expect(getManagerApiServiceMock).not.toHaveBeenCalled();\n },\n );\n\n /*\n * The recovery hops bypass the catalog, which an OS update must not do: it\n * knows the firmware it is making room for, so the catalog has the answer.\n */\n it.each([[\"0.6\"], [\"0.7\"], [\"0.9\"]])(\n \"Should resolve a bootloader reporting %s from the catalog rather than from the recovery hops\",\n async (mcuBootloaderVersion) => {\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: mcuBootloaderVersion,\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: {\n mode: \"osUpdate\",\n deviceInfo: { ...deviceInfo, mcuBootloaderVersion },\n finalFirmware,\n },\n });\n\n expect(result.extract()).toBe(\"1.12\");\n expect(getMcuListMock).toHaveBeenCalled();\n },\n );\n\n it(\"Should return the MCU name when the device is already at its starting bootloader version\", async () => {\n getProviderMock.mockReturnValue(12);\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [12],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"osUpdate\", deviceInfo, finalFirmware },\n });\n\n expect(result.extract()).toBe(\"1.12\");\n });\n\n it(\"Should ignore the number of segments when comparing bootloader versions\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16.0\",\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"osUpdate\", deviceInfo, finalFirmware },\n });\n\n expect(result.extract()).toBe(\"1.12\");\n });\n\n it(\"Should return the starting bootloader version when the device is not on it yet\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.17\",\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"osUpdate\", deviceInfo, finalFirmware },\n });\n\n expect(result.extract()).toBe(\"1.17\");\n });\n\n it(\"Should pick the highest MCU version compatible with the final firmware\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.11\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n {\n id: 2,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n {\n id: 3,\n name: \"1.13\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"osUpdate\", deviceInfo, finalFirmware },\n });\n\n expect(result.extract()).toBe(\"1.12\");\n });\n });\n\n describe(\"Bootloader recovery\", () => {\n const recoveryDeviceInfoWithoutSecureElement = {\n ...deviceInfo,\n seVersion: \"\",\n seTargetId: undefined,\n } satisfies GetOsVersionResponse;\n\n it.each([\n [\"0.0\", \"0.6\"],\n [\"0.0.0\", \"0.6\"],\n [\"0.6\", \"1.5\"],\n [\"0.7\", \"1.6\"],\n [\"0.9\", \"1.7\"],\n ])(\n \"Should force the MCU version to %s => %s without reaching the Manager API\",\n async (mcuBootloaderVersion, expectedVersion) => {\n const result = await resolveMcuVersion(apiMock)({\n input: {\n mode: \"bootloaderRecovery\",\n deviceInfo: { ...deviceInfo, mcuBootloaderVersion },\n },\n });\n\n expect(result.extract()).toBe(expectedVersion);\n expect(getManagerApiServiceMock).not.toHaveBeenCalled();\n },\n );\n\n it(\"Should resolve the final firmware of the secure element, not of the MCU\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n ]);\n setupSecureElementFirmware(finalFirmware);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"bootloaderRecovery\", deviceInfo },\n });\n\n expect(result.extract()).toBe(\"1.12\");\n expect(getDeviceVersionMock).toHaveBeenCalledWith(\n expect.objectContaining({\n targetId: deviceInfo.seTargetId,\n seVersion: deviceInfo.seVersion,\n }),\n );\n expect(getFirmwareVersionMock).toHaveBeenCalledWith(\n expect.objectContaining({\n targetId: deviceInfo.seTargetId,\n seVersion: deviceInfo.seVersion,\n }),\n deviceVersion,\n );\n });\n\n it(\"Should fall back to the bootloader version when the device reports no secure element firmware\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.11\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n {\n id: 2,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n {\n id: 3,\n name: \"1.13\",\n fromBootloaderVersion: \"1.17\",\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: {\n mode: \"bootloaderRecovery\",\n deviceInfo: recoveryDeviceInfoWithoutSecureElement,\n },\n });\n\n expect(result.extract()).toBe(\"1.12\");\n expect(getDeviceVersionMock).not.toHaveBeenCalled();\n });\n\n it(\"Should ignore MCU firmwares of another provider in the fallback\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [12],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: {\n mode: \"bootloaderRecovery\",\n deviceInfo: recoveryDeviceInfoWithoutSecureElement,\n },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveMcuVersionError);\n });\n });\n\n it(\"Should return a ResolveMcuVersionError when the MCU list is empty\", async () => {\n setupMcuList([]);\n setupSecureElementFirmware(finalFirmware);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"bootloaderRecovery\", deviceInfo },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveMcuVersionError);\n });\n });\n\n /*\n * The secure element version is sent to the Manager API as reported, so a\n * device left in OSU state has no final firmware to recover towards.\n */\n it(\"Should return a ResolveMcuVersionError when the secure element firmware is unknown\", async () => {\n const error = new Error(\"not found\");\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n ]);\n getDeviceVersionMock.mockReturnValue(\n EitherAsync(() => Promise.resolve(deviceVersion)),\n );\n getFirmwareVersionMock.mockReturnValue(\n EitherAsync(() => Promise.reject(error)),\n );\n\n const result = await resolveMcuVersion(apiMock)({\n input: {\n mode: \"bootloaderRecovery\",\n deviceInfo: { ...deviceInfo, seVersion: \"2.2.3-osu\" },\n },\n });\n\n expect(getFirmwareVersionMock).toHaveBeenCalledWith(\n expect.objectContaining({ seVersion: \"2.2.3-osu\" }),\n deviceVersion,\n );\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveMcuVersionError);\n expect(e.originalError).toBe(error);\n });\n });\n });\n\n describe(\"Error\", () => {\n it(\"Should return a ResolveMcuVersionError when the MCU list cannot be fetched\", async () => {\n const error = new Error(\"network failure\");\n getMcuListMock.mockReturnValue(\n EitherAsync(() => Promise.reject(error)) as never,\n );\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"osUpdate\", deviceInfo, finalFirmware },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveMcuVersionError);\n expect(e.originalError).toBe(error);\n });\n });\n\n it(\"Should return a ResolveMcuVersionError when no compatible MCU is found\", async () => {\n setupMcuList([\n {\n id: 99,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"osUpdate\", deviceInfo, finalFirmware },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveMcuVersionError);\n });\n });\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n type GetOsVersionResponse,\n type InternalApi,\n OnboardingState,\n SeedWordCount,\n} from \"@ledgerhq/device-management-kit\";\nimport { EitherAsync } from \"purify-ts\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { type FinalFirmware } from \"@api/device-action/OsUpdate/Shared/types\";\nimport { ResolveMcuVersionError } from \"@api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors\";\nimport { resolveMcuVersion } from \"@api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion\";\n\ndescribe(\"ResolveMcuVersion\", () => {\n const DEFAULT_MANAGER_API_PROVIDER = 1;\n const apiMock = makeDeviceActionInternalApiMock();\n const { getManagerApiService: getManagerApiServiceMock } = apiMock;\n\n const deviceInfo = {\n isBootloader: true,\n isOsu: false,\n targetId: 0x01000001,\n seTargetId: 0x33200004,\n mcuTargetId: 0x01000001,\n seVersion: \"1.3.0\",\n seFlags: new Uint8Array([0xe6, 0x00, 0x00, 0x00]),\n mcuSephVersion: \"\",\n mcuBootloaderVersion: \"1.16\",\n hwVersion: \"00\",\n langId: 0,\n recoverState: undefined,\n secureElementFlags: {\n isPinValidated: true,\n hasMcuSerialNumber: true,\n hasValidCertificate: true,\n isCustomAuthorityConnectionAllowed: false,\n isSecureConnectionAllowed: false,\n isOnboarded: true,\n isMcuCodeSigned: true,\n isInRecoveryMode: false,\n hasEndorsementCertificateInSlot1: false,\n hasEndorsementCertificateInSlot2: false,\n numberOfWords: SeedWordCount.TwentyFour,\n currentWordIndex: 0,\n onboardingState: OnboardingState.Unknown,\n },\n } satisfies GetOsVersionResponse;\n\n const finalFirmware = {\n id: 300,\n version: \"1.4.0\",\n perso: \"perso\",\n firmware: \"final\",\n firmwareKey: \"final-key\",\n hash: \"final-hash\",\n bytes: 123,\n mcuVersions: [1, 2],\n } satisfies FinalFirmware;\n\n const deviceVersion = { id: 17 };\n\n const getMcuListMock = vi.fn();\n const getProviderMock = vi.fn();\n const getDeviceVersionMock = vi.fn();\n const getFirmwareVersionMock = vi.fn();\n\n beforeEach(() => {\n vi.resetAllMocks();\n getProviderMock.mockReturnValue(DEFAULT_MANAGER_API_PROVIDER);\n getManagerApiServiceMock.mockReturnValue({\n getMcuList: getMcuListMock,\n getProvider: getProviderMock,\n getDeviceVersion: getDeviceVersionMock,\n getFirmwareVersion: getFirmwareVersionMock,\n } as unknown as ReturnType<InternalApi[\"getManagerApiService\"]>);\n });\n\n const setupMcuList = (\n mcus: Array<{\n id: number;\n name: string;\n fromBootloaderVersion: string;\n providers: number[];\n }>,\n ) => getMcuListMock.mockReturnValue(EitherAsync(() => Promise.resolve(mcus)));\n\n const setupSecureElementFirmware = (firmware: FinalFirmware) => {\n getDeviceVersionMock.mockReturnValue(\n EitherAsync(() => Promise.resolve(deviceVersion)),\n );\n getFirmwareVersionMock.mockReturnValue(\n EitherAsync(() => Promise.resolve(firmware)),\n );\n };\n\n describe(\"Success\", () => {\n it.each([[\"0.0\"], [\"0.0.0\"]])(\n \"Should force the MCU version of a bootloader reporting %s without fetching the MCU list\",\n async (mcuBootloaderVersion) => {\n const result = await resolveMcuVersion(apiMock)({\n input: {\n mode: \"osUpdate\",\n deviceInfo: { ...deviceInfo, mcuBootloaderVersion },\n finalFirmware,\n },\n });\n\n expect(result.extract()).toEqual({\n target: \"bootloader\",\n version: \"0.6\",\n });\n expect(getManagerApiServiceMock).not.toHaveBeenCalled();\n },\n );\n\n /*\n * The recovery hops bypass the catalog, which an OS update must not do: it\n * knows the firmware it is making room for, so the catalog has the answer.\n */\n it.each([[\"0.6\"], [\"0.7\"], [\"0.9\"]])(\n \"Should resolve a bootloader reporting %s from the catalog rather than from the recovery hops\",\n async (mcuBootloaderVersion) => {\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: mcuBootloaderVersion,\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: {\n mode: \"osUpdate\",\n deviceInfo: { ...deviceInfo, mcuBootloaderVersion },\n finalFirmware,\n },\n });\n\n expect(result.extract()).toEqual({ target: \"mcu\", version: \"1.12\" });\n expect(getMcuListMock).toHaveBeenCalled();\n },\n );\n\n it(\"Should return the MCU name when the device is already at its starting bootloader version\", async () => {\n getProviderMock.mockReturnValue(12);\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [12],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"osUpdate\", deviceInfo, finalFirmware },\n });\n\n expect(result.extract()).toEqual({ target: \"mcu\", version: \"1.12\" });\n });\n\n it(\"Should ignore the number of segments when comparing bootloader versions\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16.0\",\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"osUpdate\", deviceInfo, finalFirmware },\n });\n\n expect(result.extract()).toEqual({ target: \"mcu\", version: \"1.12\" });\n });\n\n it(\"Should return the starting bootloader version when the device is not on it yet\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.17\",\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"osUpdate\", deviceInfo, finalFirmware },\n });\n\n expect(result.extract()).toEqual({\n target: \"bootloader\",\n version: \"1.17\",\n });\n });\n\n it(\"Should pick the highest MCU version compatible with the final firmware\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.11\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n {\n id: 2,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n {\n id: 3,\n name: \"1.13\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"osUpdate\", deviceInfo, finalFirmware },\n });\n\n expect(result.extract()).toEqual({ target: \"mcu\", version: \"1.12\" });\n });\n });\n\n describe(\"Bootloader recovery\", () => {\n const recoveryDeviceInfoWithoutSecureElement = {\n ...deviceInfo,\n seVersion: \"\",\n seTargetId: undefined,\n } satisfies GetOsVersionResponse;\n\n it.each([\n [\"0.0\", \"0.6\"],\n [\"0.0.0\", \"0.6\"],\n [\"0.6\", \"1.5\"],\n [\"0.7\", \"1.6\"],\n [\"0.9\", \"1.7\"],\n ])(\n \"Should force the MCU version to %s => %s without reaching the Manager API\",\n async (mcuBootloaderVersion, expectedVersion) => {\n const result = await resolveMcuVersion(apiMock)({\n input: {\n mode: \"bootloaderRecovery\",\n deviceInfo: { ...deviceInfo, mcuBootloaderVersion },\n },\n });\n\n expect(result.extract()).toEqual({\n target: \"bootloader\",\n version: expectedVersion,\n });\n expect(getManagerApiServiceMock).not.toHaveBeenCalled();\n },\n );\n\n it(\"Should resolve the final firmware of the secure element, not of the MCU\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n ]);\n setupSecureElementFirmware(finalFirmware);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"bootloaderRecovery\", deviceInfo },\n });\n\n expect(result.extract()).toEqual({ target: \"mcu\", version: \"1.12\" });\n expect(getDeviceVersionMock).toHaveBeenCalledWith(\n expect.objectContaining({\n targetId: deviceInfo.seTargetId,\n seVersion: deviceInfo.seVersion,\n }),\n );\n expect(getFirmwareVersionMock).toHaveBeenCalledWith(\n expect.objectContaining({\n targetId: deviceInfo.seTargetId,\n seVersion: deviceInfo.seVersion,\n }),\n deviceVersion,\n );\n });\n\n it(\"Should fall back to the bootloader version when the device reports no secure element firmware\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.11\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n {\n id: 2,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n {\n id: 3,\n name: \"1.13\",\n fromBootloaderVersion: \"1.17\",\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: {\n mode: \"bootloaderRecovery\",\n deviceInfo: recoveryDeviceInfoWithoutSecureElement,\n },\n });\n\n expect(result.extract()).toEqual({ target: \"mcu\", version: \"1.12\" });\n expect(getDeviceVersionMock).not.toHaveBeenCalled();\n });\n\n it(\"Should ignore MCU firmwares of another provider in the fallback\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [12],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: {\n mode: \"bootloaderRecovery\",\n deviceInfo: recoveryDeviceInfoWithoutSecureElement,\n },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveMcuVersionError);\n });\n });\n\n it(\"Should return a ResolveMcuVersionError when the MCU list is empty\", async () => {\n setupMcuList([]);\n setupSecureElementFirmware(finalFirmware);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"bootloaderRecovery\", deviceInfo },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveMcuVersionError);\n });\n });\n\n /*\n * The secure element version is sent to the Manager API as reported, so a\n * device left in OSU state has no final firmware to recover towards.\n */\n it(\"Should return a ResolveMcuVersionError when the secure element firmware is unknown\", async () => {\n const error = new Error(\"not found\");\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n ]);\n getDeviceVersionMock.mockReturnValue(\n EitherAsync(() => Promise.resolve(deviceVersion)),\n );\n getFirmwareVersionMock.mockReturnValue(\n EitherAsync(() => Promise.reject(error)),\n );\n\n const result = await resolveMcuVersion(apiMock)({\n input: {\n mode: \"bootloaderRecovery\",\n deviceInfo: { ...deviceInfo, seVersion: \"2.2.3-osu\" },\n },\n });\n\n expect(getFirmwareVersionMock).toHaveBeenCalledWith(\n expect.objectContaining({ seVersion: \"2.2.3-osu\" }),\n deviceVersion,\n );\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveMcuVersionError);\n expect(e.originalError).toBe(error);\n });\n });\n });\n\n describe(\"Error\", () => {\n it(\"Should return a ResolveMcuVersionError when the MCU list cannot be fetched\", async () => {\n const error = new Error(\"network failure\");\n getMcuListMock.mockReturnValue(\n EitherAsync(() => Promise.reject(error)) as never,\n );\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"osUpdate\", deviceInfo, finalFirmware },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveMcuVersionError);\n expect(e.originalError).toBe(error);\n });\n });\n\n it(\"Should return a ResolveMcuVersionError when no compatible MCU is found\", async () => {\n setupMcuList([\n {\n id: 99,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"osUpdate\", deviceInfo, finalFirmware },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveMcuVersionError);\n });\n });\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["OnboardingState", "SeedWordCount", "EitherAsync", "makeDeviceActionInternalApiMock", "ResolveMcuVersionError", "resolveMcuVersion", "apiMock", "getManagerApiServiceMock", "deviceInfo", "finalFirmware", "deviceVersion", "getMcuListMock", "getProviderMock", "getDeviceVersionMock", "getFirmwareVersionMock", "setupMcuList", "mcus", "setupSecureElementFirmware", "firmware", "mcuBootloaderVersion", "result", "recoveryDeviceInfoWithoutSecureElement", "expectedVersion", "e", "error"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/api/device-action/OsUpdate/Update/FlashMcu/types.ts"],
4
- "sourcesContent": ["import {\n type DeviceActionState,\n type DeviceLockedError,\n type GetOsVersionResponse,\n type SecureChannelError,\n type UnknownDAError,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type FinalFirmware } from \"@api/device-action/OsUpdate/Shared/types\";\n\nimport { type FlashMcuDAErrors } from \"./FlashMcuDeviceActionErrors\";\n\n/*\n * A planned MCU flash knows the firmware it is making room for, while a\n * bootloader recovery has to derive it from whatever the broken device reports.\n */\nexport type FlashMcuDAInput =\n | {\n mode: \"osUpdate\";\n finalFirmware: FinalFirmware;\n }\n | {\n mode: \"bootloaderRecovery\";\n };\n\nexport type SecureChannelFlashMcuDAErrors =\n | SecureChannelError\n | DeviceLockedError\n | UnknownDAError;\n\nexport type FlashMcuDAError = FlashMcuDAErrors | SecureChannelFlashMcuDAErrors;\n\nexport type FlashMcuDARequiredInteraction = UserInteractionRequired.None;\n\nexport type FlashMcuDAIntermediateValue = {\n requiredUserInteraction: FlashMcuDARequiredInteraction;\n step: FlashMcuSteps;\n progress?: number;\n};\n\nexport type FlashMcuDAInternalState = {\n error: FlashMcuDAError | null;\n deviceInfo: GetOsVersionResponse | null;\n version: string | null;\n bootloaderPollAttempts: number;\n};\n\nexport type FlashMcuDAState = DeviceActionState<\n void,\n FlashMcuDAError,\n FlashMcuDAIntermediateValue\n>;\n\nexport enum FlashMcuSteps {\n Idle = \"idle\",\n GetDeviceInfo = \"getDeviceInfo\",\n ResolveMcuVersion = \"resolveMcuVersion\",\n FlashMcuOrBootloader = \"flashMcuOrBootloader\",\n}\n"],
5
- "mappings": "AAsDO,IAAKA,OACVA,EAAA,KAAO,OACPA,EAAA,cAAgB,gBAChBA,EAAA,kBAAoB,oBACpBA,EAAA,qBAAuB,uBAJbA,OAAA",
4
+ "sourcesContent": ["import {\n type DeviceActionState,\n type DeviceLockedError,\n type GetOsVersionResponse,\n type SecureChannelError,\n type UnknownDAError,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type FinalFirmware } from \"@api/device-action/OsUpdate/Shared/types\";\n\nimport { type FlashMcuDAErrors } from \"./FlashMcuDeviceActionErrors\";\n\n/*\n * A planned MCU flash knows the firmware it is making room for, while a\n * bootloader recovery has to derive it from whatever the broken device reports.\n */\nexport type FlashMcuDAInput =\n | {\n mode: \"osUpdate\";\n finalFirmware: FinalFirmware;\n }\n | {\n mode: \"bootloaderRecovery\";\n };\n\nexport type SecureChannelFlashMcuDAErrors =\n | SecureChannelError\n | DeviceLockedError\n | UnknownDAError;\n\nexport type FlashMcuDAError = FlashMcuDAErrors | SecureChannelFlashMcuDAErrors;\n\nexport type FlashMcuDARequiredInteraction = UserInteractionRequired.None;\n\nexport type FlashMcuDAIntermediateValue = {\n requiredUserInteraction: FlashMcuDARequiredInteraction;\n step: FlashMcuSteps;\n progress?: number;\n};\n\nexport type FlashTarget = \"mcu\" | \"bootloader\";\n\nexport type ResolvedFlash = {\n target: FlashTarget;\n version: string;\n};\n\n/*\n * \"mcu\" ends the flash loop. \"bootloader\" is followed by another flash.\n */\nexport type FlashMcuDAOutput = {\n target: FlashTarget;\n};\n\nexport type FlashMcuDAInternalState = {\n error: FlashMcuDAError | null;\n deviceInfo: GetOsVersionResponse | null;\n resolvedFlash: ResolvedFlash | null;\n bootloaderPollAttempts: number;\n};\n\nexport type FlashMcuDAState = DeviceActionState<\n FlashMcuDAOutput,\n FlashMcuDAError,\n FlashMcuDAIntermediateValue\n>;\n\nexport enum FlashMcuSteps {\n Idle = \"idle\",\n GetDeviceInfo = \"getDeviceInfo\",\n ResolveMcuVersion = \"resolveMcuVersion\",\n FlashMcuOrBootloader = \"flashMcuOrBootloader\",\n}\n"],
5
+ "mappings": "AAoEO,IAAKA,OACVA,EAAA,KAAO,OACPA,EAAA,cAAgB,gBAChBA,EAAA,kBAAoB,oBACpBA,EAAA,qBAAuB,uBAJbA,OAAA",
6
6
  "names": ["FlashMcuSteps"]
7
7
  }