@ledgerhq/dmk-ledger-wallet 0.6.0 → 0.7.1

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 (44) hide show
  1. package/lib/cjs/api/device-action/OsUpdate/Restore/RestoreBackup/RestoreBackupDeviceAction.js +1 -1
  2. package/lib/cjs/api/device-action/OsUpdate/Restore/RestoreBackup/RestoreBackupDeviceAction.js.map +3 -3
  3. package/lib/cjs/api/device-action/OsUpdate/Restore/RestoreBackup/RestoreBackupDeviceAction.test.js +1 -1
  4. package/lib/cjs/api/device-action/OsUpdate/Restore/RestoreBackup/RestoreBackupDeviceAction.test.js.map +3 -3
  5. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.js +1 -1
  6. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.js.map +3 -3
  7. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js +1 -1
  8. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js.map +3 -3
  9. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.js +1 -1
  10. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.js.map +2 -2
  11. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js +1 -1
  12. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js.map +2 -2
  13. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/types.js +1 -1
  14. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/types.js.map +2 -2
  15. package/lib/cjs/index.js +1 -1
  16. package/lib/cjs/index.js.map +2 -2
  17. package/lib/cjs/package.json +2 -2
  18. package/lib/esm/api/device-action/OsUpdate/Restore/RestoreBackup/RestoreBackupDeviceAction.js +1 -1
  19. package/lib/esm/api/device-action/OsUpdate/Restore/RestoreBackup/RestoreBackupDeviceAction.js.map +3 -3
  20. package/lib/esm/api/device-action/OsUpdate/Restore/RestoreBackup/RestoreBackupDeviceAction.test.js +1 -1
  21. package/lib/esm/api/device-action/OsUpdate/Restore/RestoreBackup/RestoreBackupDeviceAction.test.js.map +3 -3
  22. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.js +1 -1
  23. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.js.map +3 -3
  24. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js +1 -1
  25. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js.map +3 -3
  26. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.js +1 -1
  27. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.js.map +2 -2
  28. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js +1 -1
  29. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js.map +2 -2
  30. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/types.js.map +2 -2
  31. package/lib/esm/index.js +1 -1
  32. package/lib/esm/index.js.map +2 -2
  33. package/lib/esm/package.json +2 -2
  34. package/lib/types/api/device-action/OsUpdate/Restore/RestoreBackup/RestoreBackupDeviceAction.d.ts.map +1 -1
  35. package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.d.ts +3 -3
  36. package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.d.ts.map +1 -1
  37. package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.d.ts +2 -2
  38. package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.d.ts.map +1 -1
  39. package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/types.d.ts +10 -2
  40. package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/types.d.ts.map +1 -1
  41. package/lib/types/index.d.ts +1 -1
  42. package/lib/types/index.d.ts.map +1 -1
  43. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  44. package/package.json +6 -6
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/api/device-action/OsUpdate/Restore/RestoreBackup/RestoreBackupDeviceAction.test.ts"],
4
- "sourcesContent": ["import {\n DeviceActionStatus,\n DeviceModelId,\n RefusedByUserDAError,\n type TransportDeviceModel,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, Left, Right } from \"purify-ts\";\nimport { assign, createMachine } from \"xstate\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { testDeviceActionStates } from \"@api/device-action/__test-utils__/testDeviceActionStates\";\nimport { type Backup } from \"@api/device-action/OsUpdate/Backup/types\";\nimport { RestoreBackupDeviceAction } from \"@api/device-action/OsUpdate/Restore/RestoreBackup/RestoreBackupDeviceAction\";\nimport {\n GetIsOnboardedError,\n RequestMasterConsentError,\n} from \"@api/device-action/OsUpdate/Restore/RestoreBackup/RestoreBackupDeviceActionErrors\";\nimport { getIsOnboarded } from \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/GetIsOnboarded\";\nimport { installLanguagePackage } from \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/InstallLanguagePackage\";\nimport { installOrUpdateApps } from \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/InstallOrUpdateApps\";\nimport { requestMasterConsent } from \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/RequestMasterConsent\";\nimport { restoreAppsStorage } from \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/RestoreAppsStorage\";\nimport { uploadCustomLockScreenDevice } from \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/UploadCustomLockScreen\";\nimport {\n RequestMasterConsentResult,\n type RestoreBackupDAError,\n type RestoreBackupDAOutput,\n type RestoreBackupDARequiredInteraction,\n type RestoreBackupDAState,\n RestoreBackupSteps,\n} from \"@api/device-action/OsUpdate/Restore/RestoreBackup/types\";\nimport { goToDashboard } from \"@api/device-action/OsUpdate/Shared/Substeps/GoToDashboard\";\nimport { waitForAppAndVersion } from \"@api/device-action/OsUpdate/Shared/Substeps/WaitForAppAndVersion\";\n\nvi.mock(\"@api/device-action/OsUpdate/Shared/Substeps/WaitForAppAndVersion\");\nvi.mock(\"@api/device-action/OsUpdate/Shared/Substeps/GoToDashboard\");\nvi.mock(\n \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/GetIsOnboarded\",\n);\nvi.mock(\n \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/RequestMasterConsent\",\n);\nvi.mock(\n \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/InstallLanguagePackage\",\n);\nvi.mock(\n \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/InstallOrUpdateApps\",\n);\nvi.mock(\n \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/RestoreAppsStorage\",\n);\nvi.mock(\n \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/UploadCustomLockScreen\",\n);\n\n// \u2500\u2500\u2500 State builders \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst pendingState = (\n step: RestoreBackupSteps,\n requiredUserInteraction: RestoreBackupDARequiredInteraction = UserInteractionRequired.None,\n): RestoreBackupDAState => ({\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction,\n step,\n },\n});\n\nconst completedState = (\n output: RestoreBackupDAOutput,\n): RestoreBackupDAState => ({\n status: DeviceActionStatus.Completed,\n output,\n});\n\nconst errorState = (error: RestoreBackupDAError): RestoreBackupDAState => ({\n status: DeviceActionStatus.Error,\n error,\n});\n\n// \u2500\u2500\u2500 Mock actor factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// Creates a minimal XState machine that immediately completes (after 0 ms) with\n// the given Either output. The machine exposes the `intermediateValue` shape\n// required by the parent's `onSnapshot` handler.\n\nconst createMockActorMachineFromOutput = (\n output: () => Either<unknown, unknown>,\n) =>\n createMachine({\n initial: \"ready\",\n states: {\n ready: {\n after: { 0: \"done\" },\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n },\n done: { type: \"final\" },\n },\n output,\n });\n\nconst createMockActorMachine = (output: Either<unknown, unknown>) =>\n createMockActorMachineFromOutput(() => output);\n\n// \u2500\u2500\u2500 Fixtures \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst makeBackup = (overrides: Partial<Backup> = {}): Backup => ({\n languageId: undefined,\n installedApps: [],\n clsHexImage: undefined,\n createdAt: new Date(),\n ...overrides,\n});\n\n// \u2500\u2500\u2500 Tests \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ndescribe(\"RestoreBackupDeviceAction\", () => {\n const { getDeviceModel: getDeviceModelMock } =\n makeDeviceActionInternalApiMock();\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n // \u2500\u2500\u2500 Setup helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const setupWaitForAppAndVersion = (appName = \"BOLOS\") =>\n vi\n .mocked(waitForAppAndVersion)\n .mockReturnValue(\n createMockActorMachine(\n Right({ name: appName, version: \"1.0.0\" }),\n ) as unknown as ReturnType<typeof waitForAppAndVersion>,\n );\n\n const setupWaitForAppAndVersionSequence = (appNames: string[]) => {\n const remainingAppNames = [...appNames];\n vi.mocked(waitForAppAndVersion).mockReturnValue(\n createMockActorMachineFromOutput(() =>\n Right({\n name: remainingAppNames.shift() ?? \"BOLOS\",\n version: \"1.0.0\",\n }),\n ) as unknown as ReturnType<typeof waitForAppAndVersion>,\n );\n };\n\n const setupGoToDashboard = (\n output: Either<unknown, unknown> = Right(undefined),\n ) =>\n vi\n .mocked(goToDashboard)\n .mockReturnValue(\n createMockActorMachine(output) as unknown as ReturnType<\n typeof goToDashboard\n >,\n );\n\n const setupGetIsOnboarded = (\n result: Either<unknown, { isDeviceOnboarded: boolean }> = Right({\n isDeviceOnboarded: true,\n }),\n ) =>\n vi\n .mocked(getIsOnboarded)\n .mockReturnValue(\n () =>\n Promise.resolve(result) as ReturnType<\n ReturnType<typeof getIsOnboarded>\n >,\n );\n\n const setupRequestMasterConsent = (\n result: Either<unknown, RequestMasterConsentResult> = Right(\n RequestMasterConsentResult.GRANTED,\n ),\n ) =>\n vi\n .mocked(requestMasterConsent)\n .mockReturnValue(\n () =>\n Promise.resolve(result) as ReturnType<\n ReturnType<typeof requestMasterConsent>\n >,\n );\n\n const setupInstallLanguagePackage = (\n output: Either<unknown, unknown> = Right(undefined),\n ) =>\n vi\n .mocked(installLanguagePackage)\n .mockReturnValue(\n createMockActorMachine(output) as unknown as ReturnType<\n typeof installLanguagePackage\n >,\n );\n\n const setupInstallOrUpdateApps = (\n output: Either<unknown, unknown> = Right({\n successfullyInstalled: [],\n alreadyInstalled: [],\n missingApplications: [],\n }),\n ) =>\n vi\n .mocked(installOrUpdateApps)\n .mockReturnValue(\n createMockActorMachine(output) as unknown as ReturnType<\n typeof installOrUpdateApps\n >,\n );\n\n const setupRestoreAppsStorage = (\n output: Either<unknown, unknown> = Right([]),\n ) =>\n vi\n .mocked(restoreAppsStorage)\n .mockReturnValue(\n createMockActorMachine(output) as unknown as ReturnType<\n typeof restoreAppsStorage\n >,\n );\n\n const setupUploadCustomLockScreen = (\n output: Either<unknown, unknown> = Right(undefined),\n ) =>\n vi\n .mocked(uploadCustomLockScreenDevice)\n .mockReturnValue(\n createMockActorMachine(output) as unknown as ReturnType<\n typeof uploadCustomLockScreenDevice\n >,\n );\n\n const setupDeviceModel = (id: DeviceModelId) =>\n getDeviceModelMock.mockReturnValue({ id } as TransportDeviceModel);\n\n const makeDeviceAction = (backup: Backup = makeBackup()) =>\n new RestoreBackupDeviceAction({\n input: { backup, unlockTimeout: 30_000 },\n });\n\n // \u2500\u2500\u2500 Success \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n describe(\"Success\", () => {\n it(\"should complete the full restore flow when everything succeeds\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent();\n setupInstallLanguagePackage();\n setupInstallOrUpdateApps(\n Right({\n successfullyInstalled: [{ versionName: \"App1\" }],\n alreadyInstalled: [],\n missingApplications: [],\n }),\n );\n setupRestoreAppsStorage(\n Right([{ appName: \"App1\", restoredAppStorage: true }]),\n );\n setupUploadCustomLockScreen();\n\n const backup = makeBackup({\n languageId: 1, // french\n installedApps: [{ appName: \"App1\", data: \"0xaa\" }],\n clsHexImage: \"0x0102\",\n });\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n pendingState(RestoreBackupSteps.InstallLanguagePackage),\n pendingState(RestoreBackupSteps.InstallLanguagePackage),\n pendingState(RestoreBackupSteps.InstallOrUpdateApps),\n pendingState(RestoreBackupSteps.InstallOrUpdateApps),\n pendingState(RestoreBackupSteps.RestoreAppsStorage),\n pendingState(RestoreBackupSteps.RestoreAppsStorage),\n pendingState(RestoreBackupSteps.UploadCustomLockScreen),\n pendingState(RestoreBackupSteps.UploadCustomLockScreen),\n completedState({\n restoredLanguage: true,\n restoredCLS: true,\n restoredApps: [\n { appName: \"App1\", restoredApp: true, restoredAppStorage: true },\n ],\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(backup),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to dashboard and wait for app and version again when an app is open\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersionSequence([\"Bitcoin\", \"BOLOS\"]);\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.NANO_X);\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GoToDashboard),\n pendingState(RestoreBackupSteps.GoToDashboard),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n completedState({\n restoredLanguage: undefined,\n restoredCLS: undefined,\n restoredApps: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should still restore the language pack but skip app/storage/CLS steps when device is not onboarded\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded(Right({ isDeviceOnboarded: false }));\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent();\n setupInstallLanguagePackage();\n\n const backup = makeBackup({\n languageId: 1, // french\n installedApps: [{ appName: \"App1\", data: \"0xaa\" }],\n clsHexImage: \"0x0102\",\n });\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n pendingState(RestoreBackupSteps.InstallLanguagePackage),\n pendingState(RestoreBackupSteps.InstallLanguagePackage),\n completedState({\n restoredLanguage: true,\n restoredCLS: false,\n restoredApps: [\n {\n appName: \"App1\",\n restoredApp: false,\n restoredAppStorage: false,\n },\n ],\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(backup),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should skip RequestMasterConsent when the device does not support the feature\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.NANO_X);\n setupRequestMasterConsent(); // registered but never invoked\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n completedState({\n restoredLanguage: undefined,\n restoredCLS: undefined,\n restoredApps: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should stop and complete immediately when master consent is rejected by the user\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent(Right(RequestMasterConsentResult.REJECTED));\n setupInstallLanguagePackage(); // registered but never invoked\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n completedState({\n restoredLanguage: undefined,\n restoredCLS: undefined,\n restoredApps: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should skip InstallOrUpdateApps and RestoreAppsStorage when the backup has no app\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent();\n setupUploadCustomLockScreen();\n setupInstallOrUpdateApps(); // registered but never invoked\n setupRestoreAppsStorage(); // registered but never invoked\n\n const backup = makeBackup({ clsHexImage: \"0x0102\" });\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n pendingState(RestoreBackupSteps.UploadCustomLockScreen),\n pendingState(RestoreBackupSteps.UploadCustomLockScreen),\n completedState({\n restoredLanguage: undefined,\n restoredCLS: true,\n restoredApps: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(backup),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should skip UploadCustomLockScreen when the device does not support the feature, even if a CLS was backed up\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.NANO_X);\n setupUploadCustomLockScreen(); // registered but never invoked\n\n const backup = makeBackup({ clsHexImage: \"0x0102\" });\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n completedState({\n restoredLanguage: undefined,\n restoredCLS: false,\n restoredApps: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(backup),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should skip UploadCustomLockScreen when no CLS was backed up, even on a supported device\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent();\n setupUploadCustomLockScreen(); // registered but never invoked\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n completedState({\n restoredLanguage: undefined,\n restoredCLS: undefined,\n restoredApps: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should not fail and should keep going when the user refuses the language pack, app install, and CLS upload prompts\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent();\n setupInstallLanguagePackage(Left(new RefusedByUserDAError()));\n setupInstallOrUpdateApps(Left(new RefusedByUserDAError()));\n setupRestoreAppsStorage(Right([]));\n setupUploadCustomLockScreen(Left(new RefusedByUserDAError()));\n\n const backup = makeBackup({\n languageId: 1, // french\n installedApps: [{ appName: \"App1\", data: \"0xaa\" }],\n clsHexImage: \"0x0102\",\n });\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n pendingState(RestoreBackupSteps.InstallLanguagePackage),\n pendingState(RestoreBackupSteps.InstallLanguagePackage),\n pendingState(RestoreBackupSteps.InstallOrUpdateApps),\n pendingState(RestoreBackupSteps.InstallOrUpdateApps),\n pendingState(RestoreBackupSteps.RestoreAppsStorage),\n pendingState(RestoreBackupSteps.RestoreAppsStorage),\n pendingState(RestoreBackupSteps.UploadCustomLockScreen),\n pendingState(RestoreBackupSteps.UploadCustomLockScreen),\n completedState({\n restoredLanguage: false,\n restoredCLS: false,\n restoredApps: [\n {\n appName: \"App1\",\n restoredApp: false,\n restoredAppStorage: false,\n },\n ],\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(backup),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n });\n\n // \u2500\u2500\u2500 Error \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n describe(\"Error\", () => {\n it(\"should go to Error when waitForAppAndVersion returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n const error = new UnknownDAError(\"waitForAppAndVersion failed\");\n vi.mocked(waitForAppAndVersion).mockReturnValue(\n createMockActorMachine(Left(error)) as unknown as ReturnType<\n typeof waitForAppAndVersion\n >,\n );\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\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 goToDashboard returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion(\"Bitcoin\");\n const error = new UnknownDAError(\"goToDashboard failed\");\n setupGoToDashboard(Left(error));\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GoToDashboard),\n pendingState(RestoreBackupSteps.GoToDashboard),\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 getIsOnboarded returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n const error = new GetIsOnboardedError(new Error(\"command failed\"));\n setupGetIsOnboarded(Left(error));\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\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 requestMasterConsent fails with a fatal (non-refusal) error\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n const error = new RequestMasterConsentError(\n new Error(\"command failed\"),\n );\n setupRequestMasterConsent(Left(error));\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\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 installLanguagePackage fails with a fatal (non-refusal) error\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent();\n const error = new UnknownDAError(\"installLanguagePackage failed\");\n setupInstallLanguagePackage(Left(error));\n\n const backup = makeBackup({ languageId: 1 }); // french\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n pendingState(RestoreBackupSteps.InstallLanguagePackage),\n pendingState(RestoreBackupSteps.InstallLanguagePackage),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(backup),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to Error when installOrUpdateApps fails with a fatal (non-refusal) error\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent();\n const error = new UnknownDAError(\"installOrUpdateApps failed\");\n setupInstallOrUpdateApps(Left(error));\n\n const backup = makeBackup({\n installedApps: [{ appName: \"App1\", data: \"0xaa\" }],\n });\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n pendingState(RestoreBackupSteps.InstallOrUpdateApps),\n pendingState(RestoreBackupSteps.InstallOrUpdateApps),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(backup),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to Error when restoreAppsStorage returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent();\n setupInstallOrUpdateApps(\n Right({\n successfullyInstalled: [{ versionName: \"App1\" }],\n alreadyInstalled: [],\n missingApplications: [],\n }),\n );\n const error = new UnknownDAError(\"restoreAppsStorage failed\");\n setupRestoreAppsStorage(Left(error));\n\n const backup = makeBackup({\n installedApps: [{ appName: \"App1\", data: \"0xaa\" }],\n });\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n pendingState(RestoreBackupSteps.InstallOrUpdateApps),\n pendingState(RestoreBackupSteps.InstallOrUpdateApps),\n pendingState(RestoreBackupSteps.RestoreAppsStorage),\n pendingState(RestoreBackupSteps.RestoreAppsStorage),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(backup),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to Error when uploadCustomLockScreen fails with a fatal (non-refusal) error\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent();\n const error = new UnknownDAError(\"uploadCustomLockScreen failed\");\n setupUploadCustomLockScreen(Left(error));\n\n const backup = makeBackup({ clsHexImage: \"0x0102\" });\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n pendingState(RestoreBackupSteps.UploadCustomLockScreen),\n pendingState(RestoreBackupSteps.UploadCustomLockScreen),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(backup),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n });\n});\n"],
5
- "mappings": "AAAA,OACE,sBAAAA,EACA,iBAAAC,EACA,wBAAAC,EAEA,kBAAAC,EACA,2BAAAC,MACK,kCACP,OAAsB,QAAAC,EAAM,SAAAC,MAAa,YACzC,OAAS,UAAAC,EAAQ,iBAAAC,MAAqB,SAEtC,OAAS,mCAAAC,MAAuC,oDAChD,OAAS,0BAAAC,MAA8B,2DAEvC,OAAS,6BAAAC,MAAiC,8EAC1C,OACE,uBAAAC,EACA,6BAAAC,MACK,oFACP,OAAS,kBAAAC,MAAsB,4EAC/B,OAAS,0BAAAC,MAA8B,oFACvC,OAAS,uBAAAC,MAA2B,iFACpC,OAAS,wBAAAC,MAA4B,kFACrC,OAAS,sBAAAC,MAA0B,gFACnC,OAAS,gCAAAC,MAAoC,oFAC7C,OACE,8BAAAC,EAKA,sBAAAC,MACK,0DACP,OAAS,iBAAAC,MAAqB,4DAC9B,OAAS,wBAAAC,MAA4B,mEAErC,GAAG,KAAK,kEAAkE,EAC1E,GAAG,KAAK,2DAA2D,EACnE,GAAG,KACD,2EACF,EACA,GAAG,KACD,iFACF,EACA,GAAG,KACD,mFACF,EACA,GAAG,KACD,gFACF,EACA,GAAG,KACD,+EACF,EACA,GAAG,KACD,mFACF,EAIA,MAAMC,EAAe,CACnBC,EACAC,EAA8DtB,EAAwB,QAC5D,CAC1B,OAAQJ,EAAmB,QAC3B,kBAAmB,CACjB,wBAAA0B,EACA,KAAAD,CACF,CACF,GAEME,EACJC,IAC0B,CAC1B,OAAQ5B,EAAmB,UAC3B,OAAA4B,CACF,GAEMC,EAAcC,IAAuD,CACzE,OAAQ9B,EAAmB,MAC3B,MAAA8B,CACF,GAQMC,EACJH,GAEApB,EAAc,CACZ,QAAS,QACT,OAAQ,CACN,MAAO,CACL,MAAO,CAAE,EAAG,MAAO,EACnB,MAAOD,EAAO,CACZ,kBAAmB,KAAO,CACxB,wBAAyBH,EAAwB,IACnD,EACF,CAAC,CACH,EACA,KAAM,CAAE,KAAM,OAAQ,CACxB,EACA,OAAAwB,CACF,CAAC,EAEGI,EAA0BJ,GAC9BG,EAAiC,IAAMH,CAAM,EAIzCK,EAAa,CAACC,EAA6B,CAAC,KAAe,CAC/D,WAAY,OACZ,cAAe,CAAC,EAChB,YAAa,OACb,UAAW,IAAI,KACf,GAAGA,CACL,GAIA,SAAS,4BAA6B,IAAM,CAC1C,KAAM,CAAE,eAAgBC,CAAmB,EACzC1B,EAAgC,EAElC,WAAW,IAAM,CACf,GAAG,cAAc,CACnB,CAAC,EAID,MAAM2B,EAA4B,CAACC,EAAU,UAC3C,GACG,OAAOd,CAAoB,EAC3B,gBACCS,EACE1B,EAAM,CAAE,KAAM+B,EAAS,QAAS,OAAQ,CAAC,CAC3C,CACF,EAEEC,EAAqCC,GAAuB,CAChE,MAAMC,EAAoB,CAAC,GAAGD,CAAQ,EACtC,GAAG,OAAOhB,CAAoB,EAAE,gBAC9BQ,EAAiC,IAC/BzB,EAAM,CACJ,KAAMkC,EAAkB,MAAM,GAAK,QACnC,QAAS,OACX,CAAC,CACH,CACF,CACF,EAEMC,EAAqB,CACzBb,EAAmCtB,EAAM,MAAS,IAElD,GACG,OAAOgB,CAAa,EACpB,gBACCU,EAAuBJ,CAAM,CAG/B,EAEEc,EAAsB,CAC1BC,EAA0DrC,EAAM,CAC9D,kBAAmB,EACrB,CAAC,IAED,GACG,OAAOQ,CAAc,EACrB,gBACC,IACE,QAAQ,QAAQ6B,CAAM,CAG1B,EAEEC,EAA4B,CAChCD,EAAsDrC,EACpDc,EAA2B,OAC7B,IAEA,GACG,OAAOH,CAAoB,EAC3B,gBACC,IACE,QAAQ,QAAQ0B,CAAM,CAG1B,EAEEE,EAA8B,CAClCjB,EAAmCtB,EAAM,MAAS,IAElD,GACG,OAAOS,CAAsB,EAC7B,gBACCiB,EAAuBJ,CAAM,CAG/B,EAEEkB,EAA2B,CAC/BlB,EAAmCtB,EAAM,CACvC,sBAAuB,CAAC,EACxB,iBAAkB,CAAC,EACnB,oBAAqB,CAAC,CACxB,CAAC,IAED,GACG,OAAOU,CAAmB,EAC1B,gBACCgB,EAAuBJ,CAAM,CAG/B,EAEEmB,EAA0B,CAC9BnB,EAAmCtB,EAAM,CAAC,CAAC,IAE3C,GACG,OAAOY,CAAkB,EACzB,gBACCc,EAAuBJ,CAAM,CAG/B,EAEEoB,EAA8B,CAClCpB,EAAmCtB,EAAM,MAAS,IAElD,GACG,OAAOa,CAA4B,EACnC,gBACCa,EAAuBJ,CAAM,CAG/B,EAEEqB,EAAoBC,GACxBf,EAAmB,gBAAgB,CAAE,GAAAe,CAAG,CAAyB,EAE7DC,EAAmB,CAACC,EAAiBnB,EAAW,IACpD,IAAItB,EAA0B,CAC5B,MAAO,CAAE,OAAAyC,EAAQ,cAAe,GAAO,CACzC,CAAC,EAIH,SAAS,UAAW,IAAM,CACxB,GAAG,iEAAkE,IACnE,IAAI,QAAc,CAACC,EAASC,IAAW,CACrClB,EAA0B,EAC1BM,EAAoB,EACpBO,EAAiBhD,EAAc,IAAI,EACnC2C,EAA0B,EAC1BC,EAA4B,EAC5BC,EACExC,EAAM,CACJ,sBAAuB,CAAC,CAAE,YAAa,MAAO,CAAC,EAC/C,iBAAkB,CAAC,EACnB,oBAAqB,CAAC,CACxB,CAAC,CACH,EACAyC,EACEzC,EAAM,CAAC,CAAE,QAAS,OAAQ,mBAAoB,EAAK,CAAC,CAAC,CACvD,EACA0C,EAA4B,EAE5B,MAAMI,EAASnB,EAAW,CACxB,WAAY,EACZ,cAAe,CAAC,CAAE,QAAS,OAAQ,KAAM,MAAO,CAAC,EACjD,YAAa,QACf,CAAC,EAEKsB,EAAyC,CAC7C/B,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,cAAc,EAC9CG,EACEH,EAAmB,qBACnBjB,EAAwB,YAC1B,EACAoB,EAAaH,EAAmB,sBAAsB,EACtDG,EAAaH,EAAmB,sBAAsB,EACtDG,EAAaH,EAAmB,mBAAmB,EACnDG,EAAaH,EAAmB,mBAAmB,EACnDG,EAAaH,EAAmB,kBAAkB,EAClDG,EAAaH,EAAmB,kBAAkB,EAClDG,EAAaH,EAAmB,sBAAsB,EACtDG,EAAaH,EAAmB,sBAAsB,EACtDM,EAAe,CACb,iBAAkB,GAClB,YAAa,GACb,aAAc,CACZ,CAAE,QAAS,OAAQ,YAAa,GAAM,mBAAoB,EAAK,CACjE,CACF,CAAC,CACH,EAEAjB,EACEyC,EAAiBC,CAAM,EACvBG,EACA9C,EAAgC,EAChC,CAAE,OAAQ4C,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,EAEJ,GAAG,gFAAiF,IAClF,IAAI,QAAc,CAACD,EAASC,IAAW,CACrChB,EAAkC,CAAC,UAAW,OAAO,CAAC,EACtDG,EAAmB,EACnBC,EAAoB,EACpBO,EAAiBhD,EAAc,MAAM,EAErC,MAAMsD,EAAyC,CAC7C/B,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,aAAa,EAC7CG,EAAaH,EAAmB,aAAa,EAC7CG,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,cAAc,EAC9CM,EAAe,CACb,iBAAkB,OAClB,YAAa,OACb,aAAc,MAChB,CAAC,CACH,EAEAjB,EACEyC,EAAiB,EACjBI,EACA9C,EAAgC,EAChC,CAAE,OAAQ4C,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,EAEJ,GAAG,qGAAsG,IACvG,IAAI,QAAc,CAACD,EAASC,IAAW,CACrClB,EAA0B,EAC1BM,EAAoBpC,EAAM,CAAE,kBAAmB,EAAM,CAAC,CAAC,EACvD2C,EAAiBhD,EAAc,IAAI,EACnC2C,EAA0B,EAC1BC,EAA4B,EAE5B,MAAMO,EAASnB,EAAW,CACxB,WAAY,EACZ,cAAe,CAAC,CAAE,QAAS,OAAQ,KAAM,MAAO,CAAC,EACjD,YAAa,QACf,CAAC,EAEKsB,EAAyC,CAC7C/B,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,cAAc,EAC9CG,EACEH,EAAmB,qBACnBjB,EAAwB,YAC1B,EACAoB,EAAaH,EAAmB,sBAAsB,EACtDG,EAAaH,EAAmB,sBAAsB,EACtDM,EAAe,CACb,iBAAkB,GAClB,YAAa,GACb,aAAc,CACZ,CACE,QAAS,OACT,YAAa,GACb,mBAAoB,EACtB,CACF,CACF,CAAC,CACH,EAEAjB,EACEyC,EAAiBC,CAAM,EACvBG,EACA9C,EAAgC,EAChC,CAAE,OAAQ4C,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,EAEJ,GAAG,gFAAiF,IAClF,IAAI,QAAc,CAACD,EAASC,IAAW,CACrClB,EAA0B,EAC1BM,EAAoB,EACpBO,EAAiBhD,EAAc,MAAM,EACrC2C,EAA0B,EAE1B,MAAMW,EAAyC,CAC7C/B,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,cAAc,EAC9CM,EAAe,CACb,iBAAkB,OAClB,YAAa,OACb,aAAc,MAChB,CAAC,CACH,EAEAjB,EACEyC,EAAiB,EACjBI,EACA9C,EAAgC,EAChC,CAAE,OAAQ4C,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,EAEJ,GAAG,mFAAoF,IACrF,IAAI,QAAc,CAACD,EAASC,IAAW,CACrClB,EAA0B,EAC1BM,EAAoB,EACpBO,EAAiBhD,EAAc,IAAI,EACnC2C,EAA0BtC,EAAMc,EAA2B,QAAQ,CAAC,EACpEyB,EAA4B,EAE5B,MAAMU,EAAyC,CAC7C/B,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,cAAc,EAC9CG,EACEH,EAAmB,qBACnBjB,EAAwB,YAC1B,EACAuB,EAAe,CACb,iBAAkB,OAClB,YAAa,OACb,aAAc,MAChB,CAAC,CACH,EAEAjB,EACEyC,EAAiB,EACjBI,EACA9C,EAAgC,EAChC,CAAE,OAAQ4C,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,EAEJ,GAAG,oFAAqF,IACtF,IAAI,QAAc,CAACD,EAASC,IAAW,CACrClB,EAA0B,EAC1BM,EAAoB,EACpBO,EAAiBhD,EAAc,IAAI,EACnC2C,EAA0B,EAC1BI,EAA4B,EAC5BF,EAAyB,EACzBC,EAAwB,EAExB,MAAMK,EAASnB,EAAW,CAAE,YAAa,QAAS,CAAC,EAE7CsB,EAAyC,CAC7C/B,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,cAAc,EAC9CG,EACEH,EAAmB,qBACnBjB,EAAwB,YAC1B,EACAoB,EAAaH,EAAmB,sBAAsB,EACtDG,EAAaH,EAAmB,sBAAsB,EACtDM,EAAe,CACb,iBAAkB,OAClB,YAAa,GACb,aAAc,MAChB,CAAC,CACH,EAEAjB,EACEyC,EAAiBC,CAAM,EACvBG,EACA9C,EAAgC,EAChC,CAAE,OAAQ4C,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,EAEJ,GAAG,+GAAgH,IACjH,IAAI,QAAc,CAACD,EAASC,IAAW,CACrClB,EAA0B,EAC1BM,EAAoB,EACpBO,EAAiBhD,EAAc,MAAM,EACrC+C,EAA4B,EAE5B,MAAMI,EAASnB,EAAW,CAAE,YAAa,QAAS,CAAC,EAE7CsB,EAAyC,CAC7C/B,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,cAAc,EAC9CM,EAAe,CACb,iBAAkB,OAClB,YAAa,GACb,aAAc,MAChB,CAAC,CACH,EAEAjB,EACEyC,EAAiBC,CAAM,EACvBG,EACA9C,EAAgC,EAChC,CAAE,OAAQ4C,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,EAEJ,GAAG,2FAA4F,IAC7F,IAAI,QAAc,CAACD,EAASC,IAAW,CACrClB,EAA0B,EAC1BM,EAAoB,EACpBO,EAAiBhD,EAAc,IAAI,EACnC2C,EAA0B,EAC1BI,EAA4B,EAE5B,MAAMO,EAAyC,CAC7C/B,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,cAAc,EAC9CG,EACEH,EAAmB,qBACnBjB,EAAwB,YAC1B,EACAuB,EAAe,CACb,iBAAkB,OAClB,YAAa,OACb,aAAc,MAChB,CAAC,CACH,EAEAjB,EACEyC,EAAiB,EACjBI,EACA9C,EAAgC,EAChC,CAAE,OAAQ4C,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,EAEJ,GAAG,qHAAsH,IACvH,IAAI,QAAc,CAACD,EAASC,IAAW,CACrClB,EAA0B,EAC1BM,EAAoB,EACpBO,EAAiBhD,EAAc,IAAI,EACnC2C,EAA0B,EAC1BC,EAA4BxC,EAAK,IAAIH,CAAsB,CAAC,EAC5D4C,EAAyBzC,EAAK,IAAIH,CAAsB,CAAC,EACzD6C,EAAwBzC,EAAM,CAAC,CAAC,CAAC,EACjC0C,EAA4B3C,EAAK,IAAIH,CAAsB,CAAC,EAE5D,MAAMkD,EAASnB,EAAW,CACxB,WAAY,EACZ,cAAe,CAAC,CAAE,QAAS,OAAQ,KAAM,MAAO,CAAC,EACjD,YAAa,QACf,CAAC,EAEKsB,EAAyC,CAC7C/B,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,cAAc,EAC9CG,EACEH,EAAmB,qBACnBjB,EAAwB,YAC1B,EACAoB,EAAaH,EAAmB,sBAAsB,EACtDG,EAAaH,EAAmB,sBAAsB,EACtDG,EAAaH,EAAmB,mBAAmB,EACnDG,EAAaH,EAAmB,mBAAmB,EACnDG,EAAaH,EAAmB,kBAAkB,EAClDG,EAAaH,EAAmB,kBAAkB,EAClDG,EAAaH,EAAmB,sBAAsB,EACtDG,EAAaH,EAAmB,sBAAsB,EACtDM,EAAe,CACb,iBAAkB,GAClB,YAAa,GACb,aAAc,CACZ,CACE,QAAS,OACT,YAAa,GACb,mBAAoB,EACtB,CACF,CACF,CAAC,CACH,EAEAjB,EACEyC,EAAiBC,CAAM,EACvBG,EACA9C,EAAgC,EAChC,CAAE,OAAQ4C,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,CACN,CAAC,EAID,SAAS,QAAS,IAAM,CACtB,GAAG,4DAA6D,IAC9D,IAAI,QAAc,CAACD,EAASC,IAAW,CACrC,MAAMxB,EAAQ,IAAI3B,EAAe,6BAA6B,EAC9D,GAAG,OAAOoB,CAAoB,EAAE,gBAC9BS,EAAuB3B,EAAKyB,CAAK,CAAC,CAGpC,EAEA,MAAMyB,EAAyC,CAC7C/B,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,oBAAoB,EACpDQ,EAAWC,CAAK,CAClB,EAEApB,EACEyC,EAAiB,EACjBI,EACA9C,EAAgC,EAChC,CAAE,OAAQ4C,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,EAEJ,GAAG,qDAAsD,IACvD,IAAI,QAAc,CAACD,EAASC,IAAW,CACrClB,EAA0B,SAAS,EACnC,MAAMN,EAAQ,IAAI3B,EAAe,sBAAsB,EACvDsC,EAAmBpC,EAAKyB,CAAK,CAAC,EAE9B,MAAMyB,EAAyC,CAC7C/B,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,aAAa,EAC7CG,EAAaH,EAAmB,aAAa,EAC7CQ,EAAWC,CAAK,CAClB,EAEApB,EACEyC,EAAiB,EACjBI,EACA9C,EAAgC,EAChC,CAAE,OAAQ4C,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,EAEJ,GAAG,sDAAuD,IACxD,IAAI,QAAc,CAACD,EAASC,IAAW,CACrClB,EAA0B,EAC1B,MAAMN,EAAQ,IAAIlB,EAAoB,IAAI,MAAM,gBAAgB,CAAC,EACjE8B,EAAoBrC,EAAKyB,CAAK,CAAC,EAE/B,MAAMyB,EAAyC,CAC7C/B,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,cAAc,EAC9CQ,EAAWC,CAAK,CAClB,EAEApB,EACEyC,EAAiB,EACjBI,EACA9C,EAAgC,EAChC,CAAE,OAAQ4C,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,EAEJ,GAAG,sFAAuF,IACxF,IAAI,QAAc,CAACD,EAASC,IAAW,CACrClB,EAA0B,EAC1BM,EAAoB,EACpBO,EAAiBhD,EAAc,IAAI,EACnC,MAAM6B,EAAQ,IAAIjB,EAChB,IAAI,MAAM,gBAAgB,CAC5B,EACA+B,EAA0BvC,EAAKyB,CAAK,CAAC,EAErC,MAAMyB,EAAyC,CAC7C/B,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,cAAc,EAC9CG,EACEH,EAAmB,qBACnBjB,EAAwB,YAC1B,EACAyB,EAAWC,CAAK,CAClB,EAEApB,EACEyC,EAAiB,EACjBI,EACA9C,EAAgC,EAChC,CAAE,OAAQ4C,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,EAEJ,GAAG,wFAAyF,IAC1F,IAAI,QAAc,CAACD,EAASC,IAAW,CACrClB,EAA0B,EAC1BM,EAAoB,EACpBO,EAAiBhD,EAAc,IAAI,EACnC2C,EAA0B,EAC1B,MAAMd,EAAQ,IAAI3B,EAAe,+BAA+B,EAChE0C,EAA4BxC,EAAKyB,CAAK,CAAC,EAEvC,MAAMsB,EAASnB,EAAW,CAAE,WAAY,CAAE,CAAC,EAErCsB,EAAyC,CAC7C/B,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,cAAc,EAC9CG,EACEH,EAAmB,qBACnBjB,EAAwB,YAC1B,EACAoB,EAAaH,EAAmB,sBAAsB,EACtDG,EAAaH,EAAmB,sBAAsB,EACtDQ,EAAWC,CAAK,CAClB,EAEApB,EACEyC,EAAiBC,CAAM,EACvBG,EACA9C,EAAgC,EAChC,CAAE,OAAQ4C,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,EAEJ,GAAG,qFAAsF,IACvF,IAAI,QAAc,CAACD,EAASC,IAAW,CACrClB,EAA0B,EAC1BM,EAAoB,EACpBO,EAAiBhD,EAAc,IAAI,EACnC2C,EAA0B,EAC1B,MAAMd,EAAQ,IAAI3B,EAAe,4BAA4B,EAC7D2C,EAAyBzC,EAAKyB,CAAK,CAAC,EAEpC,MAAMsB,EAASnB,EAAW,CACxB,cAAe,CAAC,CAAE,QAAS,OAAQ,KAAM,MAAO,CAAC,CACnD,CAAC,EAEKsB,EAAyC,CAC7C/B,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,cAAc,EAC9CG,EACEH,EAAmB,qBACnBjB,EAAwB,YAC1B,EACAoB,EAAaH,EAAmB,mBAAmB,EACnDG,EAAaH,EAAmB,mBAAmB,EACnDQ,EAAWC,CAAK,CAClB,EAEApB,EACEyC,EAAiBC,CAAM,EACvBG,EACA9C,EAAgC,EAChC,CAAE,OAAQ4C,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,EAEJ,GAAG,0DAA2D,IAC5D,IAAI,QAAc,CAACD,EAASC,IAAW,CACrClB,EAA0B,EAC1BM,EAAoB,EACpBO,EAAiBhD,EAAc,IAAI,EACnC2C,EAA0B,EAC1BE,EACExC,EAAM,CACJ,sBAAuB,CAAC,CAAE,YAAa,MAAO,CAAC,EAC/C,iBAAkB,CAAC,EACnB,oBAAqB,CAAC,CACxB,CAAC,CACH,EACA,MAAMwB,EAAQ,IAAI3B,EAAe,2BAA2B,EAC5D4C,EAAwB1C,EAAKyB,CAAK,CAAC,EAEnC,MAAMsB,EAASnB,EAAW,CACxB,cAAe,CAAC,CAAE,QAAS,OAAQ,KAAM,MAAO,CAAC,CACnD,CAAC,EAEKsB,EAAyC,CAC7C/B,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,cAAc,EAC9CG,EACEH,EAAmB,qBACnBjB,EAAwB,YAC1B,EACAoB,EAAaH,EAAmB,mBAAmB,EACnDG,EAAaH,EAAmB,mBAAmB,EACnDG,EAAaH,EAAmB,kBAAkB,EAClDG,EAAaH,EAAmB,kBAAkB,EAClDQ,EAAWC,CAAK,CAClB,EAEApB,EACEyC,EAAiBC,CAAM,EACvBG,EACA9C,EAAgC,EAChC,CAAE,OAAQ4C,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,EAEJ,GAAG,wFAAyF,IAC1F,IAAI,QAAc,CAACD,EAASC,IAAW,CACrClB,EAA0B,EAC1BM,EAAoB,EACpBO,EAAiBhD,EAAc,IAAI,EACnC2C,EAA0B,EAC1B,MAAMd,EAAQ,IAAI3B,EAAe,+BAA+B,EAChE6C,EAA4B3C,EAAKyB,CAAK,CAAC,EAEvC,MAAMsB,EAASnB,EAAW,CAAE,YAAa,QAAS,CAAC,EAE7CsB,EAAyC,CAC7C/B,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,oBAAoB,EACpDG,EAAaH,EAAmB,cAAc,EAC9CG,EACEH,EAAmB,qBACnBjB,EAAwB,YAC1B,EACAoB,EAAaH,EAAmB,sBAAsB,EACtDG,EAAaH,EAAmB,sBAAsB,EACtDQ,EAAWC,CAAK,CAClB,EAEApB,EACEyC,EAAiBC,CAAM,EACvBG,EACA9C,EAAgC,EAChC,CAAE,OAAQ4C,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,CACN,CAAC,CACH,CAAC",
6
- "names": ["DeviceActionStatus", "DeviceModelId", "RefusedByUserDAError", "UnknownDAError", "UserInteractionRequired", "Left", "Right", "assign", "createMachine", "makeDeviceActionInternalApiMock", "testDeviceActionStates", "RestoreBackupDeviceAction", "GetIsOnboardedError", "RequestMasterConsentError", "getIsOnboarded", "installLanguagePackage", "installOrUpdateApps", "requestMasterConsent", "restoreAppsStorage", "uploadCustomLockScreenDevice", "RequestMasterConsentResult", "RestoreBackupSteps", "goToDashboard", "waitForAppAndVersion", "pendingState", "step", "requiredUserInteraction", "completedState", "output", "errorState", "error", "createMockActorMachineFromOutput", "createMockActorMachine", "makeBackup", "overrides", "getDeviceModelMock", "setupWaitForAppAndVersion", "appName", "setupWaitForAppAndVersionSequence", "appNames", "remainingAppNames", "setupGoToDashboard", "setupGetIsOnboarded", "result", "setupRequestMasterConsent", "setupInstallLanguagePackage", "setupInstallOrUpdateApps", "setupRestoreAppsStorage", "setupUploadCustomLockScreen", "setupDeviceModel", "id", "makeDeviceAction", "backup", "resolve", "reject", "expectedStates"]
4
+ "sourcesContent": ["import {\n DeviceActionStatus,\n DeviceModelId,\n RefusedByUserDAError,\n type TransportDeviceModel,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, Left, Right } from \"purify-ts\";\nimport { assign, createMachine } from \"xstate\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { testDeviceActionStates } from \"@api/device-action/__test-utils__/testDeviceActionStates\";\nimport { type Backup } from \"@api/device-action/OsUpdate/Backup/types\";\nimport { RestoreBackupDeviceAction } from \"@api/device-action/OsUpdate/Restore/RestoreBackup/RestoreBackupDeviceAction\";\nimport {\n GetIsOnboardedError,\n RequestMasterConsentError,\n} from \"@api/device-action/OsUpdate/Restore/RestoreBackup/RestoreBackupDeviceActionErrors\";\nimport { getIsOnboarded } from \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/GetIsOnboarded\";\nimport { installLanguagePackage } from \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/InstallLanguagePackage\";\nimport { installOrUpdateApps } from \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/InstallOrUpdateApps\";\nimport { requestMasterConsent } from \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/RequestMasterConsent\";\nimport { restoreAppsStorage } from \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/RestoreAppsStorage\";\nimport { uploadCustomLockScreenDevice } from \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/UploadCustomLockScreen\";\nimport {\n RequestMasterConsentResult,\n type RestoreBackupDAError,\n type RestoreBackupDAOutput,\n type RestoreBackupDARequiredInteraction,\n type RestoreBackupDAState,\n RestoreBackupSteps,\n} from \"@api/device-action/OsUpdate/Restore/RestoreBackup/types\";\nimport { goToDashboard } from \"@api/device-action/OsUpdate/Shared/Substeps/GoToDashboard\";\nimport { waitForAppAndVersion } from \"@api/device-action/OsUpdate/Shared/Substeps/WaitForAppAndVersion\";\n\nvi.mock(\"@api/device-action/OsUpdate/Shared/Substeps/WaitForAppAndVersion\");\nvi.mock(\"@api/device-action/OsUpdate/Shared/Substeps/GoToDashboard\");\nvi.mock(\n \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/GetIsOnboarded\",\n);\nvi.mock(\n \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/RequestMasterConsent\",\n);\nvi.mock(\n \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/InstallLanguagePackage\",\n);\nvi.mock(\n \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/InstallOrUpdateApps\",\n);\nvi.mock(\n \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/RestoreAppsStorage\",\n);\nvi.mock(\n \"@api/device-action/OsUpdate/Restore/RestoreBackup/Substeps/UploadCustomLockScreen\",\n);\n\n// \u2500\u2500\u2500 State builders \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst pendingState = (\n step: RestoreBackupSteps,\n requiredUserInteraction: RestoreBackupDARequiredInteraction = UserInteractionRequired.None,\n): RestoreBackupDAState => ({\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction,\n step,\n },\n});\n\nconst completedState = (\n output: RestoreBackupDAOutput,\n): RestoreBackupDAState => ({\n status: DeviceActionStatus.Completed,\n output,\n});\n\nconst errorState = (error: RestoreBackupDAError): RestoreBackupDAState => ({\n status: DeviceActionStatus.Error,\n error,\n});\n\n// \u2500\u2500\u2500 Mock actor factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// Creates a minimal XState machine that immediately completes (after 0 ms) with\n// the given Either output. The machine exposes the `intermediateValue` shape\n// required by the parent's `onSnapshot` handler.\n\nconst createMockActorMachineFromOutput = (\n output: () => Either<unknown, unknown>,\n) =>\n createMachine({\n initial: \"ready\",\n states: {\n ready: {\n after: { 0: \"done\" },\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n },\n done: { type: \"final\" },\n },\n output,\n });\n\nconst createMockActorMachine = (output: Either<unknown, unknown>) =>\n createMockActorMachineFromOutput(() => output);\n\n// Same as above, but the actor goes through one state per given required user\n// interaction before completing, so that each interaction is surfaced to the\n// parent through a snapshot.\nconst createMockActorMachineWithInteractions = (\n interactions: UserInteractionRequired[],\n output: Either<unknown, unknown>,\n) =>\n createMachine({\n initial: \"interaction0\",\n states: {\n ...Object.fromEntries(\n interactions.map((requiredUserInteraction, index) => [\n `interaction${index}`,\n {\n after: {\n 0:\n index + 1 < interactions.length\n ? `interaction${index + 1}`\n : \"done\",\n },\n entry: assign({\n intermediateValue: () => ({ requiredUserInteraction }),\n }),\n },\n ]),\n ),\n done: { type: \"final\" },\n },\n output: () => output,\n });\n\n// \u2500\u2500\u2500 Fixtures \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst makeBackup = (overrides: Partial<Backup> = {}): Backup => ({\n languageId: undefined,\n installedApps: [],\n clsHexImage: undefined,\n createdAt: new Date(),\n ...overrides,\n});\n\n// \u2500\u2500\u2500 Tests \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ndescribe(\"RestoreBackupDeviceAction\", () => {\n const { getDeviceModel: getDeviceModelMock } =\n makeDeviceActionInternalApiMock();\n\n beforeEach(() => {\n vi.resetAllMocks();\n // The device model is read when the state machine is created\n setupDeviceModel(DeviceModelId.NANO_X);\n });\n\n // \u2500\u2500\u2500 Setup helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const setupWaitForAppAndVersion = (appName = \"BOLOS\") =>\n vi\n .mocked(waitForAppAndVersion)\n .mockReturnValue(\n createMockActorMachine(\n Right({ name: appName, version: \"1.0.0\" }),\n ) as unknown as ReturnType<typeof waitForAppAndVersion>,\n );\n\n const setupWaitForAppAndVersionSequence = (appNames: string[]) => {\n const remainingAppNames = [...appNames];\n vi.mocked(waitForAppAndVersion).mockReturnValue(\n createMockActorMachineFromOutput(() =>\n Right({\n name: remainingAppNames.shift() ?? \"BOLOS\",\n version: \"1.0.0\",\n }),\n ) as unknown as ReturnType<typeof waitForAppAndVersion>,\n );\n };\n\n const setupGoToDashboard = (\n output: Either<unknown, unknown> = Right(undefined),\n ) =>\n vi\n .mocked(goToDashboard)\n .mockReturnValue(\n createMockActorMachine(output) as unknown as ReturnType<\n typeof goToDashboard\n >,\n );\n\n const setupGetIsOnboarded = (\n result: Either<unknown, { isDeviceOnboarded: boolean }> = Right({\n isDeviceOnboarded: true,\n }),\n ) =>\n vi\n .mocked(getIsOnboarded)\n .mockReturnValue(\n () =>\n Promise.resolve(result) as ReturnType<\n ReturnType<typeof getIsOnboarded>\n >,\n );\n\n const setupRequestMasterConsent = (\n result: Either<unknown, RequestMasterConsentResult> = Right(\n RequestMasterConsentResult.GRANTED,\n ),\n ) =>\n vi\n .mocked(requestMasterConsent)\n .mockReturnValue(\n () =>\n Promise.resolve(result) as ReturnType<\n ReturnType<typeof requestMasterConsent>\n >,\n );\n\n const setupInstallLanguagePackage = (\n output: Either<unknown, unknown> = Right(undefined),\n ) =>\n vi\n .mocked(installLanguagePackage)\n .mockReturnValue(\n createMockActorMachine(output) as unknown as ReturnType<\n typeof installLanguagePackage\n >,\n );\n\n const setupInstallOrUpdateApps = (\n output: Either<unknown, unknown> = Right({\n successfullyInstalled: [],\n alreadyInstalled: [],\n missingApplications: [],\n }),\n ) =>\n vi\n .mocked(installOrUpdateApps)\n .mockReturnValue(\n createMockActorMachine(output) as unknown as ReturnType<\n typeof installOrUpdateApps\n >,\n );\n\n const setupRestoreAppsStorage = (\n output: Either<unknown, unknown> = Right([]),\n ) =>\n vi\n .mocked(restoreAppsStorage)\n .mockReturnValue(\n createMockActorMachine(output) as unknown as ReturnType<\n typeof restoreAppsStorage\n >,\n );\n\n const setupUploadCustomLockScreen = (\n output: Either<unknown, unknown> = Right(undefined),\n ) =>\n vi\n .mocked(uploadCustomLockScreenDevice)\n .mockReturnValue(\n createMockActorMachine(output) as unknown as ReturnType<\n typeof uploadCustomLockScreenDevice\n >,\n );\n\n const setupUploadCustomLockScreenWithInteractions = (\n interactions: UserInteractionRequired[],\n ) =>\n vi\n .mocked(uploadCustomLockScreenDevice)\n .mockReturnValue(\n createMockActorMachineWithInteractions(\n interactions,\n Right(undefined),\n ) as unknown as ReturnType<typeof uploadCustomLockScreenDevice>,\n );\n\n const setupDeviceModel = (id: DeviceModelId) =>\n getDeviceModelMock.mockReturnValue({ id } as TransportDeviceModel);\n\n const makeDeviceAction = (backup: Backup = makeBackup()) =>\n new RestoreBackupDeviceAction({\n input: { backup, unlockTimeout: 30_000 },\n });\n\n // \u2500\u2500\u2500 Success \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n describe(\"Success\", () => {\n it(\"should complete the full restore flow when everything succeeds\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent();\n setupInstallLanguagePackage();\n setupInstallOrUpdateApps(\n Right({\n successfullyInstalled: [{ versionName: \"App1\" }],\n alreadyInstalled: [],\n missingApplications: [],\n }),\n );\n setupRestoreAppsStorage(\n Right([{ appName: \"App1\", restoredAppStorage: true }]),\n );\n setupUploadCustomLockScreen();\n\n const backup = makeBackup({\n languageId: 1, // french\n installedApps: [{ appName: \"App1\", data: \"0xaa\" }],\n clsHexImage: \"0x0102\",\n });\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n pendingState(RestoreBackupSteps.InstallLanguagePackage),\n pendingState(RestoreBackupSteps.InstallLanguagePackage),\n pendingState(RestoreBackupSteps.InstallOrUpdateApps),\n pendingState(RestoreBackupSteps.InstallOrUpdateApps),\n pendingState(RestoreBackupSteps.RestoreAppsStorage),\n pendingState(RestoreBackupSteps.RestoreAppsStorage),\n pendingState(RestoreBackupSteps.UploadCustomLockScreen),\n pendingState(RestoreBackupSteps.UploadCustomLockScreen),\n completedState({\n restoredLanguage: true,\n restoredCLS: true,\n restoredApps: [\n { appName: \"App1\", restoredApp: true, restoredAppStorage: true },\n ],\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(backup),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to dashboard and wait for app and version again when an app is open\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersionSequence([\"Bitcoin\", \"BOLOS\"]);\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.NANO_X);\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GoToDashboard),\n pendingState(RestoreBackupSteps.GoToDashboard),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n completedState({\n restoredLanguage: undefined,\n restoredCLS: undefined,\n restoredApps: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should still restore the language pack but skip app/storage/CLS steps when device is not onboarded\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded(Right({ isDeviceOnboarded: false }));\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent();\n setupInstallLanguagePackage();\n\n const backup = makeBackup({\n languageId: 1, // french\n installedApps: [{ appName: \"App1\", data: \"0xaa\" }],\n clsHexImage: \"0x0102\",\n });\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n pendingState(RestoreBackupSteps.InstallLanguagePackage),\n pendingState(RestoreBackupSteps.InstallLanguagePackage),\n completedState({\n restoredLanguage: true,\n restoredCLS: false,\n restoredApps: [\n {\n appName: \"App1\",\n restoredApp: false,\n restoredAppStorage: false,\n },\n ],\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(backup),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should skip RequestMasterConsent when the device does not support the feature\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.NANO_X);\n setupRequestMasterConsent(); // registered but never invoked\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n completedState({\n restoredLanguage: undefined,\n restoredCLS: undefined,\n restoredApps: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should stop and complete immediately when master consent is rejected by the user\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent(Right(RequestMasterConsentResult.REJECTED));\n setupInstallLanguagePackage(); // registered but never invoked\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n completedState({\n restoredLanguage: undefined,\n restoredCLS: undefined,\n restoredApps: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should skip InstallOrUpdateApps and RestoreAppsStorage when the backup has no app\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent();\n setupUploadCustomLockScreen();\n setupInstallOrUpdateApps(); // registered but never invoked\n setupRestoreAppsStorage(); // registered but never invoked\n\n const backup = makeBackup({ clsHexImage: \"0x0102\" });\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n pendingState(RestoreBackupSteps.UploadCustomLockScreen),\n pendingState(RestoreBackupSteps.UploadCustomLockScreen),\n completedState({\n restoredLanguage: undefined,\n restoredCLS: true,\n restoredApps: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(backup),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should skip UploadCustomLockScreen when the device does not support the feature, even if a CLS was backed up\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.NANO_X);\n setupUploadCustomLockScreen(); // registered but never invoked\n\n const backup = makeBackup({ clsHexImage: \"0x0102\" });\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n completedState({\n restoredLanguage: undefined,\n restoredCLS: false,\n restoredApps: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(backup),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should skip UploadCustomLockScreen when no CLS was backed up, even on a supported device\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent();\n setupUploadCustomLockScreen(); // registered but never invoked\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n completedState({\n restoredLanguage: undefined,\n restoredCLS: undefined,\n restoredApps: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n describe(\"UploadCustomLockScreen required user interactions\", () => {\n const runUploadCustomLockScreenInteractions = (\n deviceModelId: DeviceModelId,\n interactions: UserInteractionRequired[],\n ) =>\n new Promise<RestoreBackupDARequiredInteraction[]>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(deviceModelId);\n setupRequestMasterConsent();\n setupUploadCustomLockScreenWithInteractions(interactions);\n\n const observed: RestoreBackupDARequiredInteraction[] = [];\n const { observable } = makeDeviceAction(\n makeBackup({ clsHexImage: \"0x0102\" }),\n )._execute(makeDeviceActionInternalApiMock());\n observable.subscribe({\n next: (state) => {\n if (\n state.status === DeviceActionStatus.Pending &&\n state.intermediateValue.step ===\n RestoreBackupSteps.UploadCustomLockScreen\n ) {\n observed.push(state.intermediateValue.requiredUserInteraction);\n }\n },\n error: reject,\n complete: () => resolve(observed),\n });\n });\n\n const interactions = [\n UserInteractionRequired.UnlockDevice,\n UserInteractionRequired.ConfirmLoadImage,\n UserInteractionRequired.ConfirmCommitImage,\n ];\n\n it(\"should hide confirm load/commit image interactions but keep the others when master consent is granted\", async () => {\n const observed = await runUploadCustomLockScreenInteractions(\n DeviceModelId.STAX,\n interactions,\n );\n\n expect(observed).toContain(UserInteractionRequired.UnlockDevice);\n expect(observed).not.toContain(\n UserInteractionRequired.ConfirmLoadImage,\n );\n expect(observed).not.toContain(\n UserInteractionRequired.ConfirmCommitImage,\n );\n });\n });\n\n it(\"should not fail and should keep going when the user refuses the language pack, app install, and CLS upload prompts\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent();\n setupInstallLanguagePackage(Left(new RefusedByUserDAError()));\n setupInstallOrUpdateApps(Left(new RefusedByUserDAError()));\n setupRestoreAppsStorage(Right([]));\n setupUploadCustomLockScreen(Left(new RefusedByUserDAError()));\n\n const backup = makeBackup({\n languageId: 1, // french\n installedApps: [{ appName: \"App1\", data: \"0xaa\" }],\n clsHexImage: \"0x0102\",\n });\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n pendingState(RestoreBackupSteps.InstallLanguagePackage),\n pendingState(RestoreBackupSteps.InstallLanguagePackage),\n pendingState(RestoreBackupSteps.InstallOrUpdateApps),\n pendingState(RestoreBackupSteps.InstallOrUpdateApps),\n pendingState(RestoreBackupSteps.RestoreAppsStorage),\n pendingState(RestoreBackupSteps.RestoreAppsStorage),\n pendingState(RestoreBackupSteps.UploadCustomLockScreen),\n pendingState(RestoreBackupSteps.UploadCustomLockScreen),\n completedState({\n restoredLanguage: false,\n restoredCLS: false,\n restoredApps: [\n {\n appName: \"App1\",\n restoredApp: false,\n restoredAppStorage: false,\n },\n ],\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(backup),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n });\n\n // \u2500\u2500\u2500 Error \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n describe(\"Error\", () => {\n it(\"should go to Error when waitForAppAndVersion returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n const error = new UnknownDAError(\"waitForAppAndVersion failed\");\n vi.mocked(waitForAppAndVersion).mockReturnValue(\n createMockActorMachine(Left(error)) as unknown as ReturnType<\n typeof waitForAppAndVersion\n >,\n );\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\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 goToDashboard returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion(\"Bitcoin\");\n const error = new UnknownDAError(\"goToDashboard failed\");\n setupGoToDashboard(Left(error));\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GoToDashboard),\n pendingState(RestoreBackupSteps.GoToDashboard),\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 getIsOnboarded returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n const error = new GetIsOnboardedError(new Error(\"command failed\"));\n setupGetIsOnboarded(Left(error));\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\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 requestMasterConsent fails with a fatal (non-refusal) error\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n const error = new RequestMasterConsentError(\n new Error(\"command failed\"),\n );\n setupRequestMasterConsent(Left(error));\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\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 installLanguagePackage fails with a fatal (non-refusal) error\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent();\n const error = new UnknownDAError(\"installLanguagePackage failed\");\n setupInstallLanguagePackage(Left(error));\n\n const backup = makeBackup({ languageId: 1 }); // french\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n pendingState(RestoreBackupSteps.InstallLanguagePackage),\n pendingState(RestoreBackupSteps.InstallLanguagePackage),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(backup),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to Error when installOrUpdateApps fails with a fatal (non-refusal) error\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent();\n const error = new UnknownDAError(\"installOrUpdateApps failed\");\n setupInstallOrUpdateApps(Left(error));\n\n const backup = makeBackup({\n installedApps: [{ appName: \"App1\", data: \"0xaa\" }],\n });\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n pendingState(RestoreBackupSteps.InstallOrUpdateApps),\n pendingState(RestoreBackupSteps.InstallOrUpdateApps),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(backup),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to Error when restoreAppsStorage returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent();\n setupInstallOrUpdateApps(\n Right({\n successfullyInstalled: [{ versionName: \"App1\" }],\n alreadyInstalled: [],\n missingApplications: [],\n }),\n );\n const error = new UnknownDAError(\"restoreAppsStorage failed\");\n setupRestoreAppsStorage(Left(error));\n\n const backup = makeBackup({\n installedApps: [{ appName: \"App1\", data: \"0xaa\" }],\n });\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n pendingState(RestoreBackupSteps.InstallOrUpdateApps),\n pendingState(RestoreBackupSteps.InstallOrUpdateApps),\n pendingState(RestoreBackupSteps.RestoreAppsStorage),\n pendingState(RestoreBackupSteps.RestoreAppsStorage),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(backup),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to Error when uploadCustomLockScreen fails with a fatal (non-refusal) error\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetIsOnboarded();\n setupDeviceModel(DeviceModelId.STAX);\n setupRequestMasterConsent();\n const error = new UnknownDAError(\"uploadCustomLockScreen failed\");\n setupUploadCustomLockScreen(Left(error));\n\n const backup = makeBackup({ clsHexImage: \"0x0102\" });\n\n const expectedStates: RestoreBackupDAState[] = [\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.WaitForAppAndVersion),\n pendingState(RestoreBackupSteps.GetIsOnboarded),\n pendingState(\n RestoreBackupSteps.RequestMasterConsent,\n UserInteractionRequired.GrantConsent,\n ),\n pendingState(RestoreBackupSteps.UploadCustomLockScreen),\n pendingState(RestoreBackupSteps.UploadCustomLockScreen),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(backup),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["DeviceActionStatus", "DeviceModelId", "RefusedByUserDAError", "UnknownDAError", "UserInteractionRequired", "Left", "Right", "assign", "createMachine", "makeDeviceActionInternalApiMock", "testDeviceActionStates", "RestoreBackupDeviceAction", "GetIsOnboardedError", "RequestMasterConsentError", "getIsOnboarded", "installLanguagePackage", "installOrUpdateApps", "requestMasterConsent", "restoreAppsStorage", "uploadCustomLockScreenDevice", "RequestMasterConsentResult", "RestoreBackupSteps", "goToDashboard", "waitForAppAndVersion", "pendingState", "step", "requiredUserInteraction", "completedState", "output", "errorState", "error", "createMockActorMachineFromOutput", "createMockActorMachine", "createMockActorMachineWithInteractions", "interactions", "index", "makeBackup", "overrides", "getDeviceModelMock", "setupDeviceModel", "setupWaitForAppAndVersion", "appName", "setupWaitForAppAndVersionSequence", "appNames", "remainingAppNames", "setupGoToDashboard", "setupGetIsOnboarded", "result", "setupRequestMasterConsent", "setupInstallLanguagePackage", "setupInstallOrUpdateApps", "setupRestoreAppsStorage", "setupUploadCustomLockScreen", "setupUploadCustomLockScreenWithInteractions", "id", "makeDeviceAction", "backup", "resolve", "reject", "expectedStates", "runUploadCustomLockScreenInteractions", "deviceModelId", "observed", "observable", "state"]
7
7
  }
@@ -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": "AAAA,OACE,sBAAAA,EAEA,mBAAAC,EACA,sBAAAC,EACA,0BAAAC,EACA,iBAAAC,EACA,kBAAAC,EACA,2BAAAC,MACK,kCACP,OAAsB,QAAAC,EAAM,SAAAC,MAAa,YACzC,OAAS,cAAAC,EAAY,MAAAC,MAAU,OAE/B,OAAS,mCAAAC,MAAuC,oDAChD,OAAS,0BAAAC,MAA8B,2DACvC,OAAS,qBAAAC,MAAyB,gEAClC,OAAS,gBAAAC,MAAoB,2DAE7B,OAAS,wBAAAC,MAA4B,mEACrC,OACE,8BAAAC,EACA,0BAAAC,MACK,yEACP,OAAS,YAAAC,MAAgB,gEACzB,OAAS,qBAAAC,MAAyB,yEAClC,OAIE,iBAAAC,MAGK,oDAEP,GAAG,KAAK,0DAA0D,EAClE,GAAG,KACD,wEACF,EACA,GAAG,KAAK,+DAA+D,EAEvE,MAAMC,EAAe,CACnBC,EACAC,EAA2C,CAAC,KACvB,CACrB,OAAQvB,EAAmB,QAC3B,kBAAmB,CACjB,wBAAyBM,EAAwB,KACjD,KAAAgB,EACA,GAAGC,CACL,CACF,GAEMC,EAAiB,CAACC,EAAsB,SAA4B,CACxE,OAAQzB,EAAmB,UAC3B,OAAQ,CAAE,OAAAyB,CAAO,CACnB,GAEMC,EAAcC,IAA6C,CAC/D,OAAQ3B,EAAmB,MAC3B,MAAA2B,CACF,GAMMC,EAAwBC,GAC5B,MAAM,KAAK,CAAE,OAAQA,EAAW,EAAI,CAAE,EAAG,IACvCR,EAAaD,EAAc,aAAa,CAC1C,EAEF,SAAS,uBAAwB,IAAM,CACrC,MAAMU,EAAuB,CAC3B,aAAc,GACd,MAAO,GACP,SAAU,SACV,WAAY,UACZ,YAAa,SACb,UAAW,QACX,QAAS,IAAI,WAAW,CAAC,IAAM,EAAM,EAAM,CAAI,CAAC,EAChD,eAAgB,GAChB,qBAAsB,OACtB,UAAW,KACX,OAAQ,EACR,aAAc,OACd,mBAAoB,CAClB,eAAgB,GAChB,mBAAoB,GACpB,oBAAqB,GACrB,mCAAoC,GACpC,0BAA2B,GAC3B,YAAa,GACb,gBAAiB,GACjB,iBAAkB,GAClB,iCAAkC,GAClC,iCAAkC,GAClC,cAAe1B,EAAc,WAC7B,iBAAkB,EAClB,gBAAiBH,EAAgB,OACnC,CACF,EAEM8B,EAAgB,CACpB,GAAI,IACJ,QAAS,QACT,MAAO,QACP,SAAU,QACV,YAAa,YACb,KAAM,aACN,MAAO,IACP,YAAa,CAAC,CAAC,CACjB,EAIA,WAAW,IAAM,CACf,GAAG,cAAc,CACnB,CAAC,EAED,MAAMC,EAAoB,CACxBC,EAAgDzB,EAAMsB,CAAoB,IAE1E,GACG,OAAOhB,CAAY,EACnB,gBACC,IACE,QAAQ,QAAQmB,CAAM,CAG1B,EAEEC,EACJC,GACG,CACH,MAAMC,EAAY,CAAC,GAAGD,CAAO,EAC7B,GAAG,OAAOrB,CAAY,EAAE,gBACtB,IACE,QAAQ,QACNsB,EAAU,MAAM,GAAK5B,EAAMsB,CAAoB,CACjD,CACJ,CACF,EAEMO,EAAyB,CAC7BJ,EAAyCzB,EAAM,CAC7C,OAAQ,MACR,QAAS,MACX,CAAC,IACE,CACH,MAAM8B,EAAU,GAAG,GAAG,EAAE,kBAAkBL,CAAM,EAChD,UAAG,OAAOd,CAAiB,EAAE,gBAC3BmB,CACF,EACOA,CACT,EAEMC,EAAgB,CAACC,EAA8B9B,EAAG,IAAM,CAC5D,MAAM4B,EAAU,GAAG,GAAG,EAAE,gBAAgBE,CAAM,EAC9C,UAAG,OAAOtB,CAAQ,EAAE,gBAAgBoB,CAAO,EACpCA,CACT,EAEMG,EAAmB,CACvBC,EAAyB,CAAE,KAAM,WAAY,cAAAX,CAAc,IACxD,IAAIhB,EAAqB,CAAE,MAAA2B,CAAM,CAAC,EAEvC,SAAS,UAAW,IAAM,CACxB,GAAG,qEAAsE,IACvE,IAAI,QAAc,CAACC,EAASC,IAAW,CACrCZ,EAAkB,EAClB,MAAMa,EAA2BR,EAAuB,EAClDS,EAAkBP,EAAc,EAEhCQ,EAAoC,CACxC1B,EAAaD,EAAc,aAAa,EACxCC,EAAaD,EAAc,iBAAiB,EAC5CC,EAAaD,EAAc,oBAAoB,EAC/CC,EAAaD,EAAc,oBAAoB,EAC/CI,EAAe,CACjB,EAEAZ,EACE6B,EAAiB,EACjBM,EACApC,EAAgC,EAChC,CACE,OAAQ,IAAM,CACZ,OAAOkC,CAAwB,EAAE,qBAC/B,OAAO,iBAAiB,CACtB,MAAO,CACL,KAAM,WACN,WAAYf,EACZ,cAAAC,CACF,CACF,CAAC,CACH,EACA,OAAOe,CAAe,EAAE,qBACtB,OAAO,iBAAiB,CACtB,MAAO,CACL,WAAYhB,EACZ,QAAS,MACX,CACF,CAAC,CACH,EACAa,EAAQ,CACV,EACA,QAASC,CACX,CACF,CACF,CAAC,CAAC,EAEJ,GAAG,kEAAmE,IACpE,IAAI,QAAc,CAACD,EAASC,IAAW,CACrCZ,EAAkB,EAClBK,EAAuB7B,EAAM,CAAE,OAAQ,aAAc,QAAS,KAAM,CAAC,CAAC,EACtE,MAAMsC,EAAkBP,EAAc,EAEhCQ,EAAoC,CACxC1B,EAAaD,EAAc,aAAa,EACxCC,EAAaD,EAAc,iBAAiB,EAC5CC,EAAaD,EAAc,oBAAoB,EAC/CC,EAAaD,EAAc,oBAAoB,EAC/CI,EAAe,YAAY,CAC7B,EAEAZ,EACE6B,EAAiB,EACjBM,EACApC,EAAgC,EAChC,CACE,OAAQ,IAAM,CACZ,OAAOmC,CAAe,EAAE,qBACtB,OAAO,iBAAiB,CACtB,MAAO,CACL,WAAYhB,EACZ,QAAS,KACX,CACF,CAAC,CACH,EACAa,EAAQ,CACV,EACA,QAASC,CACX,CACF,CACF,CAAC,CAAC,EAEJ,GAAG,4EAA6E,IAC9E,IAAI,QAAc,CAACD,EAASC,IAAW,CACrCZ,EAAkB,EAClB,MAAMa,EAA2BR,EAAuB,EAClDS,EAAkBP,EAAc,EAEhCQ,EAAoC,CACxC1B,EAAaD,EAAc,aAAa,EACxCC,EAAaD,EAAc,iBAAiB,EAC5CC,EAAaD,EAAc,oBAAoB,EAC/CC,EAAaD,EAAc,oBAAoB,EAC/CI,EAAe,CACjB,EAEAZ,EACE6B,EAAiB,CAAE,KAAM,oBAAqB,CAAC,EAC/CM,EACApC,EAAgC,EAChC,CACE,OAAQ,IAAM,CACZ,OAAOkC,CAAwB,EAAE,qBAC/B,OAAO,iBAAiB,CACtB,MAAO,CACL,KAAM,qBACN,WAAYf,CACd,CACF,CAAC,CACH,EACA,OAAOgB,CAAe,EAAE,qBACtB,OAAO,iBAAiB,CACtB,MAAO,CACL,WAAYhB,EACZ,QAAS,MACX,CACF,CAAC,CACH,EACAa,EAAQ,CACV,EACA,QAASC,CACX,CACF,CACF,CAAC,CAAC,EAEJ,GAAG,sDAAuD,SAAY,CACpE,GAAG,cAAc,EACjBV,EAA0B,CACxB1B,EAAM,CAAE,GAAGsB,EAAsB,aAAc,EAAM,CAAC,EACtDtB,EAAM,CAAE,GAAGsB,EAAsB,aAAc,EAAM,CAAC,EACtDtB,EAAMsB,CAAoB,CAC5B,CAAC,EACDO,EAAuB,EACvBE,EAAc,EAEd,MAAMQ,EAAoC,CACxC,GAAGnB,EAAqB,CAAC,EACzBP,EAAaD,EAAc,iBAAiB,EAC5CC,EAAaD,EAAc,oBAAoB,EAC/CC,EAAaD,EAAc,oBAAoB,EAC/CI,EAAe,CACjB,EAEMwB,EAAO,IAAI,QAAc,CAACL,EAASC,IAAW,CAClDhC,EACE6B,EAAiB,EACjBM,EACApC,EAAgC,EAChC,CAAE,OAAQgC,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,EAED,MAAM,GAAG,yBAAyB,IAAO,CAAC,EAC1C,MAAMI,EACN,GAAG,cAAc,CACnB,CAAC,EAED,GAAG,mCAAoC,IACrC,IAAI,QAAc,CAACL,EAASC,IAAW,CACrCZ,EAAkB,EAClBK,EAAuB,EACvBE,EACE7B,EACE,CACE,KAAMP,EAAuB,SAC7B,QAAS,CAAE,SAAU,GAAK,MAAO,EAAG,MAAO,CAAE,CAC/C,EACA,CACE,KAAMA,EAAuB,SAC7B,QAAS,CAAE,SAAU,EAAG,MAAO,EAAG,MAAO,CAAE,CAC7C,CACF,CACF,EAEA,MAAM4C,EAAoC,CACxC1B,EAAaD,EAAc,aAAa,EACxCC,EAAaD,EAAc,iBAAiB,EAC5CC,EAAaD,EAAc,oBAAoB,EAC/CC,EAAaD,EAAc,oBAAoB,EAC/CC,EAAaD,EAAc,qBAAsB,CAAE,SAAU,EAAI,CAAC,EAClEC,EAAaD,EAAc,qBAAsB,CAAE,SAAU,CAAE,CAAC,EAChEI,EAAe,CACjB,EAEAZ,EACE6B,EAAiB,EACjBM,EACApC,EAAgC,EAChC,CAAE,OAAQgC,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,CACN,CAAC,EAED,SAAS,QAAS,IAAM,CACtB,GAAG,oDAAqD,IACtD,IAAI,QAAc,CAACD,EAASC,IAAW,CACrC,MAAMjB,EAAQ,IAAId,EAAkB,IAAI,MAAM,gBAAgB,CAAC,EAC/DmB,EAAkBzB,EAAKoB,CAAK,CAAC,EAE7B,MAAMoB,EAAoC,CACxC1B,EAAaD,EAAc,aAAa,EACxCM,EAAWC,CAAK,CAClB,EAEAf,EACE6B,EAAiB,EACjBM,EACApC,EAAgC,EAChC,CAAE,OAAQgC,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,EAEJ,GAAG,kEAAmE,SAAY,CAChF,GAAG,cAAc,EACjBZ,EACExB,EAAM,CAAE,GAAGsB,EAAsB,aAAc,EAAM,CAAC,CACxD,EAEA,MAAMiB,EAAoC,CACxC,GAAGnB,EAAqB,EAAE,EAC1BF,EACE,IAAIV,EACF,wDACF,CACF,CACF,EAEMgC,EAAO,IAAI,QAAc,CAACL,EAASC,IAAW,CAClDhC,EACE6B,EAAiB,EACjBM,EACApC,EAAgC,EAChC,CAAE,OAAQgC,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,EAED,MAAM,GAAG,yBAAyB,IAAO,EAAE,EAC3C,MAAMI,EACN,GAAG,cAAc,CACnB,CAAC,EAED,GAAG,yDAA0D,IAC3D,IAAI,QAAc,CAACL,EAASC,IAAW,CACrCZ,EAAkB,EAClB,MAAML,EAAQ,IAAIV,EAAuB,mBAAmB,EAC5DoB,EAAuB9B,EAAKoB,CAAK,CAAC,EAElC,MAAMoB,EAAoC,CACxC1B,EAAaD,EAAc,aAAa,EACxCC,EAAaD,EAAc,iBAAiB,EAC5CM,EAAWC,CAAK,CAClB,EAEAf,EACE6B,EAAiB,EACjBM,EACApC,EAAgC,EAChC,CAAE,OAAQgC,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,EAEJ,GAAG,mEAAoE,IACrE,IAAI,QAAc,CAACD,EAASC,IAAW,CACrCZ,EAAkB,EAClBK,EAAuB,EACvBE,EACE7B,EAAG,CACD,KAAMP,EAAuB,MAC7B,MAAO,IAAID,EAAmB,cAAc,CAC9C,CAAC,CACH,EAEA,MAAM6C,EAAoC,CACxC1B,EAAaD,EAAc,aAAa,EACxCC,EAAaD,EAAc,iBAAiB,EAC5CC,EAAaD,EAAc,oBAAoB,EAC/CC,EAAaD,EAAc,oBAAoB,EAC/CC,EAAaD,EAAc,oBAAoB,EAC/CM,EAAW,IAAIrB,CAAgB,CACjC,EAEAO,EACE6B,EAAiB,EACjBM,EACApC,EAAgC,EAChC,CAAE,OAAQgC,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,EAEJ,GAAG,yEAA0E,IAC3E,IAAI,QAAc,CAACD,EAASC,IAAW,CACrCZ,EAAkB,EAClBK,EAAuB,EACvB,MAAMV,EAAQ,IAAItB,EAAe,8BAA8B,EAC/DkC,EACE,IAAI9B,EAAYwC,GAAe,CAC7BA,EAAW,MAAMtB,CAAK,CACxB,CAAC,CACH,EAEA,MAAMoB,EAAoC,CACxC1B,EAAaD,EAAc,aAAa,EACxCC,EAAaD,EAAc,iBAAiB,EAC5CC,EAAaD,EAAc,oBAAoB,EAC/CC,EAAaD,EAAc,oBAAoB,EAC/CM,EAAWC,CAAK,CAClB,EAEAf,EACE6B,EAAiB,EACjBM,EACApC,EAAgC,EAChC,CAAE,OAAQgC,EAAS,QAASC,CAAO,CACrC,CACF,CAAC,CAAC,CACN,CAAC,CACH,CAAC",
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
  }