@ledgerhq/dmk-ledger-wallet 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/lib/cjs/api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceAction.test.js +1 -1
  2. package/lib/cjs/api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceAction.test.js.map +2 -2
  3. package/lib/cjs/api/device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath.test.js +1 -1
  4. package/lib/cjs/api/device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath.test.js.map +3 -3
  5. package/lib/cjs/api/device-action/OsUpdate/Shared/OsUpdateUtils.js +1 -1
  6. package/lib/cjs/api/device-action/OsUpdate/Shared/OsUpdateUtils.js.map +3 -3
  7. package/lib/cjs/api/device-action/OsUpdate/Shared/Substeps/GetOsVersion.test.js +1 -1
  8. package/lib/cjs/api/device-action/OsUpdate/Shared/Substeps/GetOsVersion.test.js.map +2 -2
  9. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.js +1 -1
  10. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.js.map +2 -2
  11. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js +1 -1
  12. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js.map +3 -3
  13. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu.test.js +1 -1
  14. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu.test.js.map +3 -3
  15. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.js +1 -1
  16. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.js.map +3 -3
  17. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js +1 -1
  18. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js.map +3 -3
  19. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/types.js +1 -1
  20. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/types.js.map +2 -2
  21. package/lib/cjs/api/device-action/OsUpdate/Update/InstallOsUpdate/InstallOsUpdateDeviceAction.test.js +1 -1
  22. package/lib/cjs/api/device-action/OsUpdate/Update/InstallOsUpdate/InstallOsUpdateDeviceAction.test.js.map +2 -2
  23. package/lib/cjs/api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware.test.js +1 -1
  24. package/lib/cjs/api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware.test.js.map +3 -3
  25. package/lib/cjs/package.json +2 -2
  26. package/lib/esm/api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceAction.test.js +1 -1
  27. package/lib/esm/api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceAction.test.js.map +3 -3
  28. package/lib/esm/api/device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath.test.js +1 -1
  29. package/lib/esm/api/device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath.test.js.map +3 -3
  30. package/lib/esm/api/device-action/OsUpdate/Shared/OsUpdateUtils.js +1 -1
  31. package/lib/esm/api/device-action/OsUpdate/Shared/OsUpdateUtils.js.map +3 -3
  32. package/lib/esm/api/device-action/OsUpdate/Shared/Substeps/GetOsVersion.test.js +1 -1
  33. package/lib/esm/api/device-action/OsUpdate/Shared/Substeps/GetOsVersion.test.js.map +3 -3
  34. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.js +1 -1
  35. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.js.map +2 -2
  36. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js +1 -1
  37. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js.map +3 -3
  38. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu.test.js +1 -1
  39. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu.test.js.map +3 -3
  40. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.js +1 -1
  41. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.js.map +3 -3
  42. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js +1 -1
  43. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js.map +3 -3
  44. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/types.js.map +2 -2
  45. package/lib/esm/api/device-action/OsUpdate/Update/InstallOsUpdate/InstallOsUpdateDeviceAction.test.js +1 -1
  46. package/lib/esm/api/device-action/OsUpdate/Update/InstallOsUpdate/InstallOsUpdateDeviceAction.test.js.map +3 -3
  47. package/lib/esm/api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware.test.js +1 -1
  48. package/lib/esm/api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware.test.js.map +3 -3
  49. package/lib/esm/package.json +2 -2
  50. package/lib/types/api/device-action/OsUpdate/Shared/OsUpdateUtils.d.ts +2 -0
  51. package/lib/types/api/device-action/OsUpdate/Shared/OsUpdateUtils.d.ts.map +1 -1
  52. package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.d.ts.map +1 -1
  53. package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.d.ts +2 -3
  54. package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.d.ts.map +1 -1
  55. package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/types.d.ts +3 -0
  56. package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/types.d.ts.map +1 -1
  57. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  58. package/package.json +5 -5
@@ -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 SecureChannelError,\n SecureChannelEventType,\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 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 },\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 new FlashMcuDeviceAction({\n input: {\n finalFirmware,\n },\n });\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: { deviceInfo: getOsVersionResponse, finalFirmware },\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": ["import_device_management_kit", "import_purify_ts", "import_rxjs", "import_makeInternalApi", "import_testDeviceActionStates", "import_OsUpdateDeviceActionErrors", "import_GetOsVersion", "import_FlashMcuDeviceAction", "import_FlashMcuDeviceActionErrors", "import_FlashMcu", "import_ResolveMcuVersion", "import_types", "pendingState", "step", "intermediateValue", "completedState", "errorState", "error", "bootloaderPollStates", "attempts", "getOsVersionResponse", "finalFirmware", "setupGetOsVersion", "result", "setupGetOsVersionSequence", "results", "remaining", "setupResolveMcuVersion", "handler", "setupFlashMcu", "events", "makeDeviceAction", "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} 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": ["import_device_management_kit", "import_purify_ts", "import_rxjs", "import_makeInternalApi", "import_testDeviceActionStates", "import_OsUpdateDeviceActionErrors", "import_GetOsVersion", "import_FlashMcuDeviceAction", "import_FlashMcuDeviceActionErrors", "import_FlashMcu", "import_ResolveMcuVersion", "import_types", "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"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var o=require("purify-ts"),r=require("../../../../../device-action/__test-utils__/makeInternalApi"),i=require("../../../../../device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu");describe("FlashMcu",()=>{const t=(0,r.makeDeviceActionInternalApiMock)(),{getSecureChannelService:s}=t,n={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}},e=vi.fn();beforeEach(()=>{vi.resetAllMocks(),e.mockReturnValue((0,o.Right)({})),s.mockReturnValue({updateMcu:e})}),it("Should open a secure channel with the resolved MCU version",()=>{(0,i.flashMcu)(t)({input:{deviceInfo:n,version:"1.12"}}),expect(e).toHaveBeenCalledWith(n,{version:"1.12"})})});
1
+ "use strict";var e=require("@ledgerhq/device-management-kit"),r=require("purify-ts"),s=require("../../../../../device-action/__test-utils__/makeInternalApi"),i=require("../../../../../device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu");describe("FlashMcu",()=>{const t=(0,s.makeDeviceActionInternalApiMock)(),{getSecureChannelService:a}=t,o={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:e.SeedWordCount.TwentyFour,currentWordIndex:0,onboardingState:e.OnboardingState.Unknown}},n=vi.fn();beforeEach(()=>{vi.resetAllMocks(),n.mockReturnValue((0,r.Right)({})),a.mockReturnValue({updateMcu:n})}),it("Should open a secure channel with the resolved MCU version",()=>{(0,i.flashMcu)(t)({input:{deviceInfo:o,version:"1.12"}}),expect(n).toHaveBeenCalledWith(o,{version:"1.12"})})});
2
2
  //# sourceMappingURL=FlashMcu.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../../src/api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu.test.ts"],
4
- "sourcesContent": ["import {\n type GetOsVersionResponse,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { Right } from \"purify-ts\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { flashMcu } from \"@api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu\";\n\ndescribe(\"FlashMcu\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n const { getSecureChannelService: getSecureChannelServiceMock } = apiMock;\n\n const deviceInfo = {\n isBootloader: true,\n isOsu: false,\n targetId: 0x01000001,\n seTargetId: 0x33200004,\n mcuTargetId: 0x01000001,\n seVersion: \"1.3.0\",\n seFlags: new Uint8Array([0xe6, 0x00, 0x00, 0x00]),\n mcuSephVersion: \"\",\n mcuBootloaderVersion: \"1.16\",\n hwVersion: \"00\",\n langId: 0,\n recoverState: undefined,\n secureElementFlags: {\n isPinValidated: true,\n hasMcuSerialNumber: true,\n hasValidCertificate: true,\n isCustomAuthorityConnectionAllowed: false,\n isSecureConnectionAllowed: false,\n isOnboarded: true,\n isMcuCodeSigned: true,\n isInRecoveryMode: false,\n },\n } satisfies GetOsVersionResponse;\n\n const updateMcuMock = vi.fn();\n\n beforeEach(() => {\n vi.resetAllMocks();\n updateMcuMock.mockReturnValue(Right({}));\n getSecureChannelServiceMock.mockReturnValue({\n updateMcu: updateMcuMock,\n } as unknown as ReturnType<InternalApi[\"getSecureChannelService\"]>);\n });\n\n it(\"Should open a secure channel with the resolved MCU version\", () => {\n flashMcu(apiMock)({ input: { deviceInfo, version: \"1.12\" } });\n\n expect(updateMcuMock).toHaveBeenCalledWith(deviceInfo, {\n version: \"1.12\",\n });\n });\n});\n"],
5
- "mappings": "aAIA,IAAAA,EAAsB,qBAEtBC,EAAgD,6DAChDC,EAAyB,yEAEzB,SAAS,WAAY,IAAM,CACzB,MAAMC,KAAU,mCAAgC,EAC1C,CAAE,wBAAyBC,CAA4B,EAAID,EAE3DE,EAAa,CACjB,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,EACpB,CACF,EAEMC,EAAgB,GAAG,GAAG,EAE5B,WAAW,IAAM,CACf,GAAG,cAAc,EACjBA,EAAc,mBAAgB,SAAM,CAAC,CAAC,CAAC,EACvCF,EAA4B,gBAAgB,CAC1C,UAAWE,CACb,CAAkE,CACpE,CAAC,EAED,GAAG,6DAA8D,IAAM,IACrE,YAASH,CAAO,EAAE,CAAE,MAAO,CAAE,WAAAE,EAAY,QAAS,MAAO,CAAE,CAAC,EAE5D,OAAOC,CAAa,EAAE,qBAAqBD,EAAY,CACrD,QAAS,MACX,CAAC,CACH,CAAC,CACH,CAAC",
6
- "names": ["import_purify_ts", "import_makeInternalApi", "import_FlashMcu", "apiMock", "getSecureChannelServiceMock", "deviceInfo", "updateMcuMock"]
4
+ "sourcesContent": ["import {\n type GetOsVersionResponse,\n type InternalApi,\n OnboardingState,\n SeedWordCount,\n} from \"@ledgerhq/device-management-kit\";\nimport { Right } from \"purify-ts\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { flashMcu } from \"@api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu\";\n\ndescribe(\"FlashMcu\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n const { getSecureChannelService: getSecureChannelServiceMock } = apiMock;\n\n const deviceInfo = {\n isBootloader: true,\n isOsu: false,\n targetId: 0x01000001,\n seTargetId: 0x33200004,\n mcuTargetId: 0x01000001,\n seVersion: \"1.3.0\",\n seFlags: new Uint8Array([0xe6, 0x00, 0x00, 0x00]),\n mcuSephVersion: \"\",\n mcuBootloaderVersion: \"1.16\",\n hwVersion: \"00\",\n langId: 0,\n recoverState: undefined,\n secureElementFlags: {\n isPinValidated: true,\n hasMcuSerialNumber: true,\n hasValidCertificate: true,\n isCustomAuthorityConnectionAllowed: false,\n isSecureConnectionAllowed: false,\n isOnboarded: true,\n isMcuCodeSigned: true,\n isInRecoveryMode: false,\n hasEndorsementCertificateInSlot1: false,\n hasEndorsementCertificateInSlot2: false,\n numberOfWords: SeedWordCount.TwentyFour,\n currentWordIndex: 0,\n onboardingState: OnboardingState.Unknown,\n },\n } satisfies GetOsVersionResponse;\n\n const updateMcuMock = vi.fn();\n\n beforeEach(() => {\n vi.resetAllMocks();\n updateMcuMock.mockReturnValue(Right({}));\n getSecureChannelServiceMock.mockReturnValue({\n updateMcu: updateMcuMock,\n } as unknown as ReturnType<InternalApi[\"getSecureChannelService\"]>);\n });\n\n it(\"Should open a secure channel with the resolved MCU version\", () => {\n flashMcu(apiMock)({ input: { deviceInfo, version: \"1.12\" } });\n\n expect(updateMcuMock).toHaveBeenCalledWith(deviceInfo, {\n version: \"1.12\",\n });\n });\n});\n"],
5
+ "mappings": "aAAA,IAAAA,EAKO,2CACPC,EAAsB,qBAEtBC,EAAgD,6DAChDC,EAAyB,yEAEzB,SAAS,WAAY,IAAM,CACzB,MAAMC,KAAU,mCAAgC,EAC1C,CAAE,wBAAyBC,CAA4B,EAAID,EAE3DE,EAAa,CACjB,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,cAAe,gBAAc,WAC7B,iBAAkB,EAClB,gBAAiB,kBAAgB,OACnC,CACF,EAEMC,EAAgB,GAAG,GAAG,EAE5B,WAAW,IAAM,CACf,GAAG,cAAc,EACjBA,EAAc,mBAAgB,SAAM,CAAC,CAAC,CAAC,EACvCF,EAA4B,gBAAgB,CAC1C,UAAWE,CACb,CAAkE,CACpE,CAAC,EAED,GAAG,6DAA8D,IAAM,IACrE,YAASH,CAAO,EAAE,CAAE,MAAO,CAAE,WAAAE,EAAY,QAAS,MAAO,CAAE,CAAC,EAE5D,OAAOC,CAAa,EAAE,qBAAqBD,EAAY,CACrD,QAAS,MACX,CAAC,CACH,CAAC,CACH,CAAC",
6
+ "names": ["import_device_management_kit", "import_purify_ts", "import_makeInternalApi", "import_FlashMcu", "apiMock", "getSecureChannelServiceMock", "deviceInfo", "updateMcuMock"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var a=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var V=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var v=(e,r)=>{for(var o in r)a(e,o,{get:r[o],enumerable:!0})},R=(e,r,o,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of V(r))!d.call(e,n)&&n!==o&&a(e,n,{get:()=>r[n],enumerable:!(s=M(r,n))||s.enumerable});return e};var f=e=>R(a({},"__esModule",{value:!0}),e);var A={};v(A,{resolveMcuVersion:()=>y});module.exports=f(A);var t=require("purify-ts"),c=require("../../../../../device-action/OsUpdate/Shared/OsUpdateUtils"),l=require("../../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors");const g=new Map([["0.0","0.6"],["0.6","1.5"],["0.7","1.6"],["0.9","1.7"]]),w=e=>new l.ResolveMcuVersionError(e),E=e=>e.getManagerApiService().getMcuList().map(r=>r.map(o=>({id:o.id,name:o.name,fromBootloaderVersion:o.fromBootloaderVersion,providers:o.providers}))).mapLeft(w),y=e=>({input:{deviceInfo:r,finalFirmware:o}})=>{const s=g.get(r.mcuBootloaderVersion);return s!==void 0?Promise.resolve((0,t.Right)(s)):(0,t.EitherAsync)(async({fromPromise:n,throwE:p})=>{const m=await n(E(e)),u=e.getManagerApiService().getProvider(),i=(0,c.bestCompatibleMcu)(m,o,u);return i?i.fromBootloaderVersion===r.mcuBootloaderVersion?i.name:i.fromBootloaderVersion:p(new l.ResolveMcuVersionError(`No MCU firmware compatible with the final firmware ${o.version}`))}).run()};0&&(module.exports={resolveMcuVersion});
1
+ "use strict";var u=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var R=Object.prototype.hasOwnProperty;var h=(e,r)=>{for(var o in r)u(e,o,{get:r[o],enumerable:!0})},f=(e,r,o,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of M(r))!R.call(e,t)&&t!==o&&u(e,t,{get:()=>r[t],enumerable:!(n=V(r,t))||n.enumerable});return e};var g=e=>f(u({},"__esModule",{value:!0}),e);var O={};h(O,{resolveMcuVersion:()=>C});module.exports=g(O);var i=require("purify-ts"),c=require("../../../../../device-action/OsUpdate/Shared/OsUpdateUtils"),d=require("../../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors");const E=new Map([["0.0","0.6"]]),w=new Map([["0.0","0.6"],["0.6","1.5"],["0.7","1.6"],["0.9","1.7"]]),y=e=>{switch(e){case"osUpdate":return E;case"bootloaderRecovery":return w;default:return e}},v=e=>new d.ResolveMcuVersionError(e),A=e=>e.getManagerApiService().getMcuList().map(r=>r.map(o=>({id:o.id,name:o.name,fromBootloaderVersion:o.fromBootloaderVersion,providers:o.providers}))).mapLeft(v),I=e=>e.split(".").slice(0,2).join("."),F=(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(v)},b=(e,r)=>{switch(r.mode){case"osUpdate":return i.EitherAsync.liftEither((0,i.Right)(r.finalFirmware));case"bootloaderRecovery":{const{seVersion:o,seTargetId:n}=r.deviceInfo;return o!==""&&n!==void 0?F(e,r.deviceInfo,n):i.EitherAsync.liftEither((0,i.Right)(null))}default:return r}},C=e=>({input:r})=>{const{deviceInfo:o}=r,n=y(r.mode).get(I(o.mcuBootloaderVersion));return n!==void 0?Promise.resolve((0,i.Right)(n)):(0,i.EitherAsync)(async({fromPromise:t,throwE:s})=>{const m=await t(A(e)),p=e.getManagerApiService().getProvider(),a=await t(b(e,r)),l=a?(0,c.bestCompatibleMcu)(m,a,p):(0,c.bestMcuForBootloaderVersion)(m,o.mcuBootloaderVersion,p);return l?(0,c.isSameBootloaderVersion)(l.fromBootloaderVersion,o.mcuBootloaderVersion)?l.name:l.fromBootloaderVersion:s(new d.ResolveMcuVersionError(a?`No MCU firmware compatible with the final firmware ${a.version}`:`No MCU firmware compatible with the bootloader version ${o.mcuBootloaderVersion}`))}).run()};0&&(module.exports={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 { bestCompatibleMcu } 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\";\n\nconst 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\ntype ResolveMcuVersionHandlerArgs = {\n input: {\n deviceInfo: GetOsVersionResponse;\n finalFirmware: FinalFirmware;\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\nexport const resolveMcuVersion =\n (internalApi: InternalApi): ResolveMcuVersionHandler =>\n ({\n input: { deviceInfo, finalFirmware },\n }: ResolveMcuVersionHandlerArgs): ResolveMcuVersionHandlerResponse => {\n const forcedVersion = FORCED_MCU_VERSIONS.get(\n 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 mcu = bestCompatibleMcu(mcuList, finalFirmware, provider);\n\n if (!mcu) {\n return throwE(\n new ResolveMcuVersionError(\n `No MCU firmware compatible with the final firmware ${finalFirmware.version}`,\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 mcu.fromBootloaderVersion === deviceInfo.mcuBootloaderVersion\n ? mcu.name\n : mcu.fromBootloaderVersion;\n },\n ).run();\n };\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAAgD,qBAEhDC,EAAkC,4DAKlCC,EAAuC,kFAEvC,MAAMC,EAAsB,IAAI,IAAI,CAClC,CAAC,MAAO,KAAK,EACb,CAAC,MAAO,KAAK,EACb,CAAC,MAAO,KAAK,EACb,CAAC,MAAO,KAAK,CACf,CAAC,EAiBKC,EAA4BC,GAChC,IAAI,yBAAuBA,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,EAExBN,EACVS,GACD,CAAC,CACC,MAAO,CAAE,WAAAG,EAAY,cAAAC,CAAc,CACrC,IAAsE,CACpE,MAAMC,EAAgBT,EAAoB,IACxCO,EAAW,oBACb,EAEA,OAAIE,IAAkB,OACb,QAAQ,WAAQ,SAAMA,CAAa,CAAC,KAGtC,eACL,MAAO,CAAE,YAAAC,EAAa,OAAAC,CAAO,IAAM,CACjC,MAAMN,EAAU,MAAMK,EAAYP,EAAWC,CAAW,CAAC,EACnDQ,EAAWR,EAAY,qBAAqB,EAAE,YAAY,EAC1DE,KAAM,qBAAkBD,EAASG,EAAeI,CAAQ,EAE9D,OAAKN,EAUEA,EAAI,wBAA0BC,EAAW,qBAC5CD,EAAI,KACJA,EAAI,sBAXCK,EACL,IAAI,yBACF,sDAAsDH,EAAc,OAAO,EAC7E,CACF,CAQJ,CACF,EAAE,IAAI,CACR",
6
- "names": ["ResolveMcuVersion_exports", "__export", "resolveMcuVersion", "__toCommonJS", "import_purify_ts", "import_OsUpdateUtils", "import_FlashMcuDeviceActionErrors", "FORCED_MCU_VERSIONS", "toResolveMcuVersionError", "error", "getMcuList", "internalApi", "mcuList", "mcu", "deviceInfo", "finalFirmware", "forcedVersion", "fromPromise", "throwE", "provider"]
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": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAAgD,qBAEhDC,EAIO,4DAKPC,EAAuC,kFASvC,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,IAAI,yBAAuBA,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,OAAO,cAAY,cAAW,SAAMA,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,EACA,cAAY,cAAW,SAAM,IAAI,CAAC,CACxC,CACA,QAEE,OAD+BM,CAGnC,CACF,EAEazB,EACVY,GACD,CAAC,CACC,MAAAa,CACF,IAAsE,CACpE,KAAM,CAAE,WAAAP,CAAW,EAAIO,EACjBE,EAAgBpB,EAAkBkB,EAAM,IAAI,EAAE,IAClDV,EAAqBG,EAAW,oBAAoB,CACtD,EAEA,OAAIS,IAAkB,OACb,QAAQ,WAAQ,SAAMA,CAAa,CAAC,KAGtC,eACL,MAAO,CAAE,YAAAC,EAAa,OAAAC,CAAO,IAAM,CACjC,MAAMhB,EAAU,MAAMe,EAAYjB,EAAWC,CAAW,CAAC,EACnDkB,EAAWlB,EAAY,qBAAqB,EAAE,YAAY,EAC1DW,EAAgB,MAAMK,EAC1BJ,EAAiBZ,EAAaa,CAAK,CACrC,EACMX,EAAMS,KACR,qBAAkBV,EAASU,EAAeO,CAAQ,KAClD,+BACEjB,EACAK,EAAW,qBACXY,CACF,EAEJ,OAAKhB,KAYE,2BACLA,EAAI,sBACJI,EAAW,oBACb,EACIJ,EAAI,KACJA,EAAI,sBAhBCe,EACL,IAAI,yBACFN,EACI,sDAAsDA,EAAc,OAAO,GAC3E,0DAA0DL,EAAW,oBAAoB,EAC/F,CACF,CAWJ,CACF,EAAE,IAAI,CACR",
6
+ "names": ["ResolveMcuVersion_exports", "__export", "resolveMcuVersion", "__toCommonJS", "import_purify_ts", "import_OsUpdateUtils", "import_FlashMcuDeviceActionErrors", "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", "forcedVersion", "fromPromise", "throwE", "provider"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var u=require("purify-ts"),p=require("../../../../../device-action/__test-utils__/makeInternalApi"),d=require("../../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors"),t=require("../../../../../device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion");describe("ResolveMcuVersion",()=>{const r=(0,p.makeDeviceActionInternalApiMock)(),{getManagerApiService:m}=r,o={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}},i={id:300,version:"1.4.0",perso:"perso",firmware:"final",firmwareKey:"final-key",hash:"final-hash",bytes:123,mcuVersions:[1,2]},c=vi.fn(),l=vi.fn();beforeEach(()=>{vi.resetAllMocks(),l.mockReturnValue(1),m.mockReturnValue({getMcuList:c,getProvider:l})});const s=e=>c.mockReturnValue((0,u.EitherAsync)(()=>Promise.resolve(e)));describe("Success",()=>{it.each([["0.0","0.6"],["0.6","1.5"],["0.7","1.6"],["0.9","1.7"]])("Should force the MCU version to %s => %s without fetching the MCU list",async(e,n)=>{const a=await(0,t.resolveMcuVersion)(r)({input:{deviceInfo:{...o,mcuBootloaderVersion:e},finalFirmware:i}});expect(a.extract()).toBe(n),expect(m).not.toHaveBeenCalled()}),it("Should return the MCU name when the device is already at its starting bootloader version",async()=>{l.mockReturnValue(12),s([{id:1,name:"1.12",fromBootloaderVersion:"1.16",providers:[12]}]);const e=await(0,t.resolveMcuVersion)(r)({input:{deviceInfo:o,finalFirmware:i}});expect(e.extract()).toBe("1.12")}),it("Should return the starting bootloader version when the device is not on it yet",async()=>{s([{id:1,name:"1.12",fromBootloaderVersion:"1.17",providers:[1]}]);const e=await(0,t.resolveMcuVersion)(r)({input:{deviceInfo:o,finalFirmware:i}});expect(e.extract()).toBe("1.17")}),it("Should pick the highest MCU version compatible with the final firmware",async()=>{s([{id:1,name:"1.11",fromBootloaderVersion:"1.16",providers:[1]},{id:2,name:"1.12",fromBootloaderVersion:"1.16",providers:[1]},{id:3,name:"1.13",fromBootloaderVersion:"1.16",providers:[1]}]);const e=await(0,t.resolveMcuVersion)(r)({input:{deviceInfo:o,finalFirmware:i}});expect(e.extract()).toBe("1.12")})}),describe("Error",()=>{it("Should return a ResolveMcuVersionError when the MCU list cannot be fetched",async()=>{const e=new Error("network failure");c.mockReturnValue((0,u.EitherAsync)(()=>Promise.reject(e)));const n=await(0,t.resolveMcuVersion)(r)({input:{deviceInfo:o,finalFirmware:i}});expect(n.isLeft()).toBe(!0),n.mapLeft(a=>{expect(a).toBeInstanceOf(d.ResolveMcuVersionError),expect(a.originalError).toBe(e)})}),it("Should return a ResolveMcuVersionError when no compatible MCU is found",async()=>{s([{id:99,name:"1.12",fromBootloaderVersion:"1.16",providers:[1]}]);const e=await(0,t.resolveMcuVersion)(r)({input:{deviceInfo:o,finalFirmware:i}});expect(e.isLeft()).toBe(!0),e.mapLeft(n=>{expect(n).toBeInstanceOf(d.ResolveMcuVersionError)})})})});
1
+ "use strict";var v=require("@ledgerhq/device-management-kit"),c=require("purify-ts"),g=require("../../../../../device-action/__test-utils__/makeInternalApi"),d=require("../../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors"),n=require("../../../../../device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion");describe("ResolveMcuVersion",()=>{const r=(0,g.makeDeviceActionInternalApiMock)(),{getManagerApiService:h}=r,t={isBootloader:!0,isOsu:!1,targetId:16777217,seTargetId:857735172,mcuTargetId:16777217,seVersion:"1.3.0",seFlags:new Uint8Array([230,0,0,0]),mcuSephVersion:"",mcuBootloaderVersion:"1.16",hwVersion:"00",langId:0,recoverState:void 0,secureElementFlags:{isPinValidated:!0,hasMcuSerialNumber:!0,hasValidCertificate:!0,isCustomAuthorityConnectionAllowed:!1,isSecureConnectionAllowed:!1,isOnboarded:!0,isMcuCodeSigned:!0,isInRecoveryMode:!1,hasEndorsementCertificateInSlot1:!1,hasEndorsementCertificateInSlot2:!1,numberOfWords:v.SeedWordCount.TwentyFour,currentWordIndex:0,onboardingState:v.OnboardingState.Unknown}},a={id:300,version:"1.4.0",perso:"perso",firmware:"final",firmwareKey:"final-key",hash:"final-hash",bytes:123,mcuVersions:[1,2]},m={id:17},p=vi.fn(),V=vi.fn(),l=vi.fn(),u=vi.fn();beforeEach(()=>{vi.resetAllMocks(),V.mockReturnValue(1),h.mockReturnValue({getMcuList:p,getProvider:V,getDeviceVersion:l,getFirmwareVersion:u})});const i=e=>p.mockReturnValue((0,c.EitherAsync)(()=>Promise.resolve(e))),w=e=>{l.mockReturnValue((0,c.EitherAsync)(()=>Promise.resolve(m))),u.mockReturnValue((0,c.EitherAsync)(()=>Promise.resolve(e)))};describe("Success",()=>{it.each([["0.0"],["0.0.0"]])("Should force the MCU version of a bootloader reporting %s without fetching the MCU list",async e=>{const o=await(0,n.resolveMcuVersion)(r)({input:{mode:"osUpdate",deviceInfo:{...t,mcuBootloaderVersion:e},finalFirmware:a}});expect(o.extract()).toBe("0.6"),expect(h).not.toHaveBeenCalled()}),it.each([["0.6"],["0.7"],["0.9"]])("Should resolve a bootloader reporting %s from the catalog rather than from the recovery hops",async e=>{i([{id:1,name:"1.12",fromBootloaderVersion:e,providers:[1]}]);const o=await(0,n.resolveMcuVersion)(r)({input:{mode:"osUpdate",deviceInfo:{...t,mcuBootloaderVersion:e},finalFirmware:a}});expect(o.extract()).toBe("1.12"),expect(p).toHaveBeenCalled()}),it("Should return the MCU name when the device is already at its starting bootloader version",async()=>{V.mockReturnValue(12),i([{id:1,name:"1.12",fromBootloaderVersion:"1.16",providers:[12]}]);const e=await(0,n.resolveMcuVersion)(r)({input:{mode:"osUpdate",deviceInfo:t,finalFirmware:a}});expect(e.extract()).toBe("1.12")}),it("Should ignore the number of segments when comparing bootloader versions",async()=>{i([{id:1,name:"1.12",fromBootloaderVersion:"1.16.0",providers:[1]}]);const e=await(0,n.resolveMcuVersion)(r)({input:{mode:"osUpdate",deviceInfo:t,finalFirmware:a}});expect(e.extract()).toBe("1.12")}),it("Should return the starting bootloader version when the device is not on it yet",async()=>{i([{id:1,name:"1.12",fromBootloaderVersion:"1.17",providers:[1]}]);const e=await(0,n.resolveMcuVersion)(r)({input:{mode:"osUpdate",deviceInfo:t,finalFirmware:a}});expect(e.extract()).toBe("1.17")}),it("Should pick the highest MCU version compatible with the final firmware",async()=>{i([{id:1,name:"1.11",fromBootloaderVersion:"1.16",providers:[1]},{id:2,name:"1.12",fromBootloaderVersion:"1.16",providers:[1]},{id:3,name:"1.13",fromBootloaderVersion:"1.16",providers:[1]}]);const e=await(0,n.resolveMcuVersion)(r)({input:{mode:"osUpdate",deviceInfo:t,finalFirmware:a}});expect(e.extract()).toBe("1.12")})}),describe("Bootloader recovery",()=>{const e={...t,seVersion:"",seTargetId:void 0};it.each([["0.0","0.6"],["0.0.0","0.6"],["0.6","1.5"],["0.7","1.6"],["0.9","1.7"]])("Should force the MCU version to %s => %s without reaching the Manager API",async(o,s)=>{const f=await(0,n.resolveMcuVersion)(r)({input:{mode:"bootloaderRecovery",deviceInfo:{...t,mcuBootloaderVersion:o}}});expect(f.extract()).toBe(s),expect(h).not.toHaveBeenCalled()}),it("Should resolve the final firmware of the secure element, not of the MCU",async()=>{i([{id:1,name:"1.12",fromBootloaderVersion:"1.16",providers:[1]}]),w(a);const o=await(0,n.resolveMcuVersion)(r)({input:{mode:"bootloaderRecovery",deviceInfo:t}});expect(o.extract()).toBe("1.12"),expect(l).toHaveBeenCalledWith(expect.objectContaining({targetId:t.seTargetId,seVersion:t.seVersion})),expect(u).toHaveBeenCalledWith(expect.objectContaining({targetId:t.seTargetId,seVersion:t.seVersion}),m)}),it("Should fall back to the bootloader version when the device reports no secure element firmware",async()=>{i([{id:1,name:"1.11",fromBootloaderVersion:"1.16",providers:[1]},{id:2,name:"1.12",fromBootloaderVersion:"1.16",providers:[1]},{id:3,name:"1.13",fromBootloaderVersion:"1.17",providers:[1]}]);const o=await(0,n.resolveMcuVersion)(r)({input:{mode:"bootloaderRecovery",deviceInfo:e}});expect(o.extract()).toBe("1.12"),expect(l).not.toHaveBeenCalled()}),it("Should ignore MCU firmwares of another provider in the fallback",async()=>{i([{id:1,name:"1.12",fromBootloaderVersion:"1.16",providers:[12]}]);const o=await(0,n.resolveMcuVersion)(r)({input:{mode:"bootloaderRecovery",deviceInfo:e}});expect(o.isLeft()).toBe(!0),o.mapLeft(s=>{expect(s).toBeInstanceOf(d.ResolveMcuVersionError)})}),it("Should return a ResolveMcuVersionError when the MCU list is empty",async()=>{i([]),w(a);const o=await(0,n.resolveMcuVersion)(r)({input:{mode:"bootloaderRecovery",deviceInfo:t}});expect(o.isLeft()).toBe(!0),o.mapLeft(s=>{expect(s).toBeInstanceOf(d.ResolveMcuVersionError)})}),it("Should return a ResolveMcuVersionError when the secure element firmware is unknown",async()=>{const o=new Error("not found");i([{id:1,name:"1.12",fromBootloaderVersion:"1.16",providers:[1]}]),l.mockReturnValue((0,c.EitherAsync)(()=>Promise.resolve(m))),u.mockReturnValue((0,c.EitherAsync)(()=>Promise.reject(o)));const s=await(0,n.resolveMcuVersion)(r)({input:{mode:"bootloaderRecovery",deviceInfo:{...t,seVersion:"2.2.3-osu"}}});expect(u).toHaveBeenCalledWith(expect.objectContaining({seVersion:"2.2.3-osu"}),m),expect(s.isLeft()).toBe(!0),s.mapLeft(f=>{expect(f).toBeInstanceOf(d.ResolveMcuVersionError),expect(f.originalError).toBe(o)})})}),describe("Error",()=>{it("Should return a ResolveMcuVersionError when the MCU list cannot be fetched",async()=>{const e=new Error("network failure");p.mockReturnValue((0,c.EitherAsync)(()=>Promise.reject(e)));const o=await(0,n.resolveMcuVersion)(r)({input:{mode:"osUpdate",deviceInfo:t,finalFirmware:a}});expect(o.isLeft()).toBe(!0),o.mapLeft(s=>{expect(s).toBeInstanceOf(d.ResolveMcuVersionError),expect(s.originalError).toBe(e)})}),it("Should return a ResolveMcuVersionError when no compatible MCU is found",async()=>{i([{id:99,name:"1.12",fromBootloaderVersion:"1.16",providers:[1]}]);const e=await(0,n.resolveMcuVersion)(r)({input:{mode:"osUpdate",deviceInfo:t,finalFirmware:a}});expect(e.isLeft()).toBe(!0),e.mapLeft(o=>{expect(o).toBeInstanceOf(d.ResolveMcuVersionError)})})})});
2
2
  //# sourceMappingURL=ResolveMcuVersion.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../../src/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.ts"],
4
- "sourcesContent": ["import {\n type GetOsVersionResponse,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { EitherAsync } from \"purify-ts\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { type FinalFirmware } from \"@api/device-action/OsUpdate/Shared/types\";\nimport { ResolveMcuVersionError } from \"@api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors\";\nimport { resolveMcuVersion } from \"@api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion\";\n\ndescribe(\"ResolveMcuVersion\", () => {\n const DEFAULT_MANAGER_API_PROVIDER = 1;\n const apiMock = makeDeviceActionInternalApiMock();\n const { getManagerApiService: getManagerApiServiceMock } = apiMock;\n\n const deviceInfo = {\n isBootloader: true,\n isOsu: false,\n targetId: 0x01000001,\n seTargetId: 0x33200004,\n mcuTargetId: 0x01000001,\n seVersion: \"1.3.0\",\n seFlags: new Uint8Array([0xe6, 0x00, 0x00, 0x00]),\n mcuSephVersion: \"\",\n mcuBootloaderVersion: \"1.16\",\n hwVersion: \"00\",\n langId: 0,\n recoverState: undefined,\n secureElementFlags: {\n isPinValidated: true,\n hasMcuSerialNumber: true,\n hasValidCertificate: true,\n isCustomAuthorityConnectionAllowed: false,\n isSecureConnectionAllowed: false,\n isOnboarded: true,\n isMcuCodeSigned: true,\n isInRecoveryMode: false,\n },\n } satisfies GetOsVersionResponse;\n\n const finalFirmware = {\n id: 300,\n version: \"1.4.0\",\n perso: \"perso\",\n firmware: \"final\",\n firmwareKey: \"final-key\",\n hash: \"final-hash\",\n bytes: 123,\n mcuVersions: [1, 2],\n } satisfies FinalFirmware;\n\n const getMcuListMock = vi.fn();\n const getProviderMock = vi.fn();\n\n beforeEach(() => {\n vi.resetAllMocks();\n getProviderMock.mockReturnValue(DEFAULT_MANAGER_API_PROVIDER);\n getManagerApiServiceMock.mockReturnValue({\n getMcuList: getMcuListMock,\n getProvider: getProviderMock,\n } as unknown as ReturnType<InternalApi[\"getManagerApiService\"]>);\n });\n\n const setupMcuList = (\n mcus: Array<{\n id: number;\n name: string;\n fromBootloaderVersion: string;\n providers: number[];\n }>,\n ) => getMcuListMock.mockReturnValue(EitherAsync(() => Promise.resolve(mcus)));\n\n describe(\"Success\", () => {\n it.each([\n [\"0.0\", \"0.6\"],\n [\"0.6\", \"1.5\"],\n [\"0.7\", \"1.6\"],\n [\"0.9\", \"1.7\"],\n ])(\n \"Should force the MCU version to %s => %s without fetching the MCU list\",\n async (mcuBootloaderVersion, expectedVersion) => {\n const result = await resolveMcuVersion(apiMock)({\n input: {\n deviceInfo: { ...deviceInfo, mcuBootloaderVersion },\n finalFirmware,\n },\n });\n\n expect(result.extract()).toBe(expectedVersion);\n expect(getManagerApiServiceMock).not.toHaveBeenCalled();\n },\n );\n\n it(\"Should return the MCU name when the device is already at its starting bootloader version\", async () => {\n getProviderMock.mockReturnValue(12);\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [12],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { deviceInfo, finalFirmware },\n });\n\n expect(result.extract()).toBe(\"1.12\");\n });\n\n it(\"Should return the starting bootloader version when the device is not on it yet\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.17\",\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { deviceInfo, finalFirmware },\n });\n\n expect(result.extract()).toBe(\"1.17\");\n });\n\n it(\"Should pick the highest MCU version compatible with the final firmware\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.11\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n {\n id: 2,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n {\n id: 3,\n name: \"1.13\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { deviceInfo, finalFirmware },\n });\n\n expect(result.extract()).toBe(\"1.12\");\n });\n });\n\n describe(\"Error\", () => {\n it(\"Should return a ResolveMcuVersionError when the MCU list cannot be fetched\", async () => {\n const error = new Error(\"network failure\");\n getMcuListMock.mockReturnValue(\n EitherAsync(() => Promise.reject(error)) as never,\n );\n\n const result = await resolveMcuVersion(apiMock)({\n input: { deviceInfo, finalFirmware },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveMcuVersionError);\n expect(e.originalError).toBe(error);\n });\n });\n\n it(\"Should return a ResolveMcuVersionError when no compatible MCU is found\", async () => {\n setupMcuList([\n {\n id: 99,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { deviceInfo, finalFirmware },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveMcuVersionError);\n });\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_purify_ts", "import_makeInternalApi", "import_FlashMcuDeviceActionErrors", "import_ResolveMcuVersion", "apiMock", "getManagerApiServiceMock", "deviceInfo", "finalFirmware", "getMcuListMock", "getProviderMock", "setupMcuList", "mcus", "mcuBootloaderVersion", "expectedVersion", "result", "error", "e"]
4
+ "sourcesContent": ["import {\n type GetOsVersionResponse,\n type InternalApi,\n OnboardingState,\n SeedWordCount,\n} from \"@ledgerhq/device-management-kit\";\nimport { EitherAsync } from \"purify-ts\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { type FinalFirmware } from \"@api/device-action/OsUpdate/Shared/types\";\nimport { ResolveMcuVersionError } from \"@api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors\";\nimport { resolveMcuVersion } from \"@api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion\";\n\ndescribe(\"ResolveMcuVersion\", () => {\n const DEFAULT_MANAGER_API_PROVIDER = 1;\n const apiMock = makeDeviceActionInternalApiMock();\n const { getManagerApiService: getManagerApiServiceMock } = apiMock;\n\n const deviceInfo = {\n isBootloader: true,\n isOsu: false,\n targetId: 0x01000001,\n seTargetId: 0x33200004,\n mcuTargetId: 0x01000001,\n seVersion: \"1.3.0\",\n seFlags: new Uint8Array([0xe6, 0x00, 0x00, 0x00]),\n mcuSephVersion: \"\",\n mcuBootloaderVersion: \"1.16\",\n hwVersion: \"00\",\n langId: 0,\n recoverState: undefined,\n secureElementFlags: {\n isPinValidated: true,\n hasMcuSerialNumber: true,\n hasValidCertificate: true,\n isCustomAuthorityConnectionAllowed: false,\n isSecureConnectionAllowed: false,\n isOnboarded: true,\n isMcuCodeSigned: true,\n isInRecoveryMode: false,\n hasEndorsementCertificateInSlot1: false,\n hasEndorsementCertificateInSlot2: false,\n numberOfWords: SeedWordCount.TwentyFour,\n currentWordIndex: 0,\n onboardingState: OnboardingState.Unknown,\n },\n } satisfies GetOsVersionResponse;\n\n const finalFirmware = {\n id: 300,\n version: \"1.4.0\",\n perso: \"perso\",\n firmware: \"final\",\n firmwareKey: \"final-key\",\n hash: \"final-hash\",\n bytes: 123,\n mcuVersions: [1, 2],\n } satisfies FinalFirmware;\n\n const deviceVersion = { id: 17 };\n\n const getMcuListMock = vi.fn();\n const getProviderMock = vi.fn();\n const getDeviceVersionMock = vi.fn();\n const getFirmwareVersionMock = vi.fn();\n\n beforeEach(() => {\n vi.resetAllMocks();\n getProviderMock.mockReturnValue(DEFAULT_MANAGER_API_PROVIDER);\n getManagerApiServiceMock.mockReturnValue({\n getMcuList: getMcuListMock,\n getProvider: getProviderMock,\n getDeviceVersion: getDeviceVersionMock,\n getFirmwareVersion: getFirmwareVersionMock,\n } as unknown as ReturnType<InternalApi[\"getManagerApiService\"]>);\n });\n\n const setupMcuList = (\n mcus: Array<{\n id: number;\n name: string;\n fromBootloaderVersion: string;\n providers: number[];\n }>,\n ) => getMcuListMock.mockReturnValue(EitherAsync(() => Promise.resolve(mcus)));\n\n const setupSecureElementFirmware = (firmware: FinalFirmware) => {\n getDeviceVersionMock.mockReturnValue(\n EitherAsync(() => Promise.resolve(deviceVersion)),\n );\n getFirmwareVersionMock.mockReturnValue(\n EitherAsync(() => Promise.resolve(firmware)),\n );\n };\n\n describe(\"Success\", () => {\n it.each([[\"0.0\"], [\"0.0.0\"]])(\n \"Should force the MCU version of a bootloader reporting %s without fetching the MCU list\",\n async (mcuBootloaderVersion) => {\n const result = await resolveMcuVersion(apiMock)({\n input: {\n mode: \"osUpdate\",\n deviceInfo: { ...deviceInfo, mcuBootloaderVersion },\n finalFirmware,\n },\n });\n\n expect(result.extract()).toBe(\"0.6\");\n expect(getManagerApiServiceMock).not.toHaveBeenCalled();\n },\n );\n\n /*\n * The recovery hops bypass the catalog, which an OS update must not do: it\n * knows the firmware it is making room for, so the catalog has the answer.\n */\n it.each([[\"0.6\"], [\"0.7\"], [\"0.9\"]])(\n \"Should resolve a bootloader reporting %s from the catalog rather than from the recovery hops\",\n async (mcuBootloaderVersion) => {\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: mcuBootloaderVersion,\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: {\n mode: \"osUpdate\",\n deviceInfo: { ...deviceInfo, mcuBootloaderVersion },\n finalFirmware,\n },\n });\n\n expect(result.extract()).toBe(\"1.12\");\n expect(getMcuListMock).toHaveBeenCalled();\n },\n );\n\n it(\"Should return the MCU name when the device is already at its starting bootloader version\", async () => {\n getProviderMock.mockReturnValue(12);\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [12],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"osUpdate\", deviceInfo, finalFirmware },\n });\n\n expect(result.extract()).toBe(\"1.12\");\n });\n\n it(\"Should ignore the number of segments when comparing bootloader versions\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16.0\",\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"osUpdate\", deviceInfo, finalFirmware },\n });\n\n expect(result.extract()).toBe(\"1.12\");\n });\n\n it(\"Should return the starting bootloader version when the device is not on it yet\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.17\",\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"osUpdate\", deviceInfo, finalFirmware },\n });\n\n expect(result.extract()).toBe(\"1.17\");\n });\n\n it(\"Should pick the highest MCU version compatible with the final firmware\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.11\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n {\n id: 2,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n {\n id: 3,\n name: \"1.13\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"osUpdate\", deviceInfo, finalFirmware },\n });\n\n expect(result.extract()).toBe(\"1.12\");\n });\n });\n\n describe(\"Bootloader recovery\", () => {\n const recoveryDeviceInfoWithoutSecureElement = {\n ...deviceInfo,\n seVersion: \"\",\n seTargetId: undefined,\n } satisfies GetOsVersionResponse;\n\n it.each([\n [\"0.0\", \"0.6\"],\n [\"0.0.0\", \"0.6\"],\n [\"0.6\", \"1.5\"],\n [\"0.7\", \"1.6\"],\n [\"0.9\", \"1.7\"],\n ])(\n \"Should force the MCU version to %s => %s without reaching the Manager API\",\n async (mcuBootloaderVersion, expectedVersion) => {\n const result = await resolveMcuVersion(apiMock)({\n input: {\n mode: \"bootloaderRecovery\",\n deviceInfo: { ...deviceInfo, mcuBootloaderVersion },\n },\n });\n\n expect(result.extract()).toBe(expectedVersion);\n expect(getManagerApiServiceMock).not.toHaveBeenCalled();\n },\n );\n\n it(\"Should resolve the final firmware of the secure element, not of the MCU\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n ]);\n setupSecureElementFirmware(finalFirmware);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"bootloaderRecovery\", deviceInfo },\n });\n\n expect(result.extract()).toBe(\"1.12\");\n expect(getDeviceVersionMock).toHaveBeenCalledWith(\n expect.objectContaining({\n targetId: deviceInfo.seTargetId,\n seVersion: deviceInfo.seVersion,\n }),\n );\n expect(getFirmwareVersionMock).toHaveBeenCalledWith(\n expect.objectContaining({\n targetId: deviceInfo.seTargetId,\n seVersion: deviceInfo.seVersion,\n }),\n deviceVersion,\n );\n });\n\n it(\"Should fall back to the bootloader version when the device reports no secure element firmware\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.11\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n {\n id: 2,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n {\n id: 3,\n name: \"1.13\",\n fromBootloaderVersion: \"1.17\",\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: {\n mode: \"bootloaderRecovery\",\n deviceInfo: recoveryDeviceInfoWithoutSecureElement,\n },\n });\n\n expect(result.extract()).toBe(\"1.12\");\n expect(getDeviceVersionMock).not.toHaveBeenCalled();\n });\n\n it(\"Should ignore MCU firmwares of another provider in the fallback\", async () => {\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [12],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: {\n mode: \"bootloaderRecovery\",\n deviceInfo: recoveryDeviceInfoWithoutSecureElement,\n },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveMcuVersionError);\n });\n });\n\n it(\"Should return a ResolveMcuVersionError when the MCU list is empty\", async () => {\n setupMcuList([]);\n setupSecureElementFirmware(finalFirmware);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"bootloaderRecovery\", deviceInfo },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveMcuVersionError);\n });\n });\n\n /*\n * The secure element version is sent to the Manager API as reported, so a\n * device left in OSU state has no final firmware to recover towards.\n */\n it(\"Should return a ResolveMcuVersionError when the secure element firmware is unknown\", async () => {\n const error = new Error(\"not found\");\n setupMcuList([\n {\n id: 1,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n ]);\n getDeviceVersionMock.mockReturnValue(\n EitherAsync(() => Promise.resolve(deviceVersion)),\n );\n getFirmwareVersionMock.mockReturnValue(\n EitherAsync(() => Promise.reject(error)),\n );\n\n const result = await resolveMcuVersion(apiMock)({\n input: {\n mode: \"bootloaderRecovery\",\n deviceInfo: { ...deviceInfo, seVersion: \"2.2.3-osu\" },\n },\n });\n\n expect(getFirmwareVersionMock).toHaveBeenCalledWith(\n expect.objectContaining({ seVersion: \"2.2.3-osu\" }),\n deviceVersion,\n );\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveMcuVersionError);\n expect(e.originalError).toBe(error);\n });\n });\n });\n\n describe(\"Error\", () => {\n it(\"Should return a ResolveMcuVersionError when the MCU list cannot be fetched\", async () => {\n const error = new Error(\"network failure\");\n getMcuListMock.mockReturnValue(\n EitherAsync(() => Promise.reject(error)) as never,\n );\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"osUpdate\", deviceInfo, finalFirmware },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveMcuVersionError);\n expect(e.originalError).toBe(error);\n });\n });\n\n it(\"Should return a ResolveMcuVersionError when no compatible MCU is found\", async () => {\n setupMcuList([\n {\n id: 99,\n name: \"1.12\",\n fromBootloaderVersion: \"1.16\",\n providers: [1],\n },\n ]);\n\n const result = await resolveMcuVersion(apiMock)({\n input: { mode: \"osUpdate\", deviceInfo, finalFirmware },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveMcuVersionError);\n });\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_device_management_kit", "import_purify_ts", "import_makeInternalApi", "import_FlashMcuDeviceActionErrors", "import_ResolveMcuVersion", "apiMock", "getManagerApiServiceMock", "deviceInfo", "finalFirmware", "deviceVersion", "getMcuListMock", "getProviderMock", "getDeviceVersionMock", "getFirmwareVersionMock", "setupMcuList", "mcus", "setupSecureElementFirmware", "firmware", "mcuBootloaderVersion", "result", "recoveryDeviceInfoWithoutSecureElement", "expectedVersion", "e", "error"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var n=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var u=(o,r)=>{for(var t in r)n(o,t,{get:r[t],enumerable:!0})},p=(o,r,t,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let e of c(r))!s.call(o,e)&&e!==t&&n(o,e,{get:()=>r[e],enumerable:!(a=l(r,e))||a.enumerable});return o};var D=o=>p(n({},"__esModule",{value:!0}),o);var A={};u(A,{FlashMcuSteps:()=>i});module.exports=D(A);var i=(e=>(e.Idle="idle",e.GetDeviceInfo="getDeviceInfo",e.ResolveMcuVersion="resolveMcuVersion",e.FlashMcuOrBootloader="flashMcuOrBootloader",e))(i||{});0&&(module.exports={FlashMcuSteps});
1
+ "use strict";var n=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var u=(o,r)=>{for(var t in r)n(o,t,{get:r[t],enumerable:!0})},p=(o,r,t,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let e of c(r))!s.call(o,e)&&e!==t&&n(o,e,{get:()=>r[e],enumerable:!(a=i(r,e))||a.enumerable});return o};var D=o=>p(n({},"__esModule",{value:!0}),o);var d={};u(d,{FlashMcuSteps:()=>l});module.exports=D(d);var l=(e=>(e.Idle="idle",e.GetDeviceInfo="getDeviceInfo",e.ResolveMcuVersion="resolveMcuVersion",e.FlashMcuOrBootloader="flashMcuOrBootloader",e))(l||{});0&&(module.exports={FlashMcuSteps});
2
2
  //# sourceMappingURL=types.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/api/device-action/OsUpdate/Update/FlashMcu/types.ts"],
4
- "sourcesContent": ["import {\n type DeviceActionState,\n type DeviceLockedError,\n type GetOsVersionResponse,\n type SecureChannelError,\n type UnknownDAError,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type FinalFirmware } from \"@api/device-action/OsUpdate/Shared/types\";\n\nimport { type FlashMcuDAErrors } from \"./FlashMcuDeviceActionErrors\";\n\nexport type FlashMcuDAInput = {\n finalFirmware: FinalFirmware;\n};\n\nexport type SecureChannelFlashMcuDAErrors =\n | SecureChannelError\n | DeviceLockedError\n | UnknownDAError;\n\nexport type FlashMcuDAError = FlashMcuDAErrors | SecureChannelFlashMcuDAErrors;\n\nexport type FlashMcuDARequiredInteraction = UserInteractionRequired.None;\n\nexport type FlashMcuDAIntermediateValue = {\n requiredUserInteraction: FlashMcuDARequiredInteraction;\n step: FlashMcuSteps;\n progress?: number;\n};\n\nexport type FlashMcuDAInternalState = {\n error: FlashMcuDAError | null;\n deviceInfo: GetOsVersionResponse | null;\n version: string | null;\n bootloaderPollAttempts: number;\n};\n\nexport type FlashMcuDAState = DeviceActionState<\n void,\n FlashMcuDAError,\n FlashMcuDAIntermediateValue\n>;\n\nexport enum FlashMcuSteps {\n Idle = \"idle\",\n GetDeviceInfo = \"getDeviceInfo\",\n ResolveMcuVersion = \"resolveMcuVersion\",\n FlashMcuOrBootloader = \"flashMcuOrBootloader\",\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,IAAA,eAAAC,EAAAH,GA6CO,IAAKE,OACVA,EAAA,KAAO,OACPA,EAAA,cAAgB,gBAChBA,EAAA,kBAAoB,oBACpBA,EAAA,qBAAuB,uBAJbA,OAAA",
4
+ "sourcesContent": ["import {\n type DeviceActionState,\n type DeviceLockedError,\n type GetOsVersionResponse,\n type SecureChannelError,\n type UnknownDAError,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type FinalFirmware } from \"@api/device-action/OsUpdate/Shared/types\";\n\nimport { type FlashMcuDAErrors } from \"./FlashMcuDeviceActionErrors\";\n\n/*\n * A planned MCU flash knows the firmware it is making room for, while a\n * bootloader recovery has to derive it from whatever the broken device reports.\n */\nexport type FlashMcuDAInput =\n | {\n mode: \"osUpdate\";\n finalFirmware: FinalFirmware;\n }\n | {\n mode: \"bootloaderRecovery\";\n };\n\nexport type SecureChannelFlashMcuDAErrors =\n | SecureChannelError\n | DeviceLockedError\n | UnknownDAError;\n\nexport type FlashMcuDAError = FlashMcuDAErrors | SecureChannelFlashMcuDAErrors;\n\nexport type FlashMcuDARequiredInteraction = UserInteractionRequired.None;\n\nexport type FlashMcuDAIntermediateValue = {\n requiredUserInteraction: FlashMcuDARequiredInteraction;\n step: FlashMcuSteps;\n progress?: number;\n};\n\nexport type FlashMcuDAInternalState = {\n error: FlashMcuDAError | null;\n deviceInfo: GetOsVersionResponse | null;\n version: string | null;\n bootloaderPollAttempts: number;\n};\n\nexport type FlashMcuDAState = DeviceActionState<\n void,\n FlashMcuDAError,\n FlashMcuDAIntermediateValue\n>;\n\nexport enum FlashMcuSteps {\n Idle = \"idle\",\n GetDeviceInfo = \"getDeviceInfo\",\n ResolveMcuVersion = \"resolveMcuVersion\",\n FlashMcuOrBootloader = \"flashMcuOrBootloader\",\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,IAAA,eAAAC,EAAAH,GAsDO,IAAKE,OACVA,EAAA,KAAO,OACPA,EAAA,cAAgB,gBAChBA,EAAA,kBAAoB,oBACpBA,EAAA,qBAAuB,uBAJbA,OAAA",
6
6
  "names": ["types_exports", "__export", "FlashMcuSteps", "__toCommonJS"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var o=require("@ledgerhq/device-management-kit"),c=require("purify-ts"),w=require("rxjs"),S=require("xstate"),i=require("../../../../device-action/__test-utils__/makeInternalApi"),l=require("../../../../device-action/__test-utils__/testDeviceActionStates"),O=require("../../../../device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors"),D=require("../../../../device-action/OsUpdate/Shared/Substeps/GetOsVersion"),y=require("../../../../device-action/OsUpdate/Shared/Substeps/GoToDashboard"),I=require("../../../../device-action/OsUpdate/Shared/Substeps/WaitForAppAndVersion"),U=require("../../../../device-action/OsUpdate/Update/InstallOsUpdate/InstallOsUpdateDeviceAction"),g=require("../../../../device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware"),e=require("../../../../device-action/OsUpdate/Update/InstallOsUpdate/types");vi.mock("@api/device-action/OsUpdate/Shared/Substeps/WaitForAppAndVersion");vi.mock("@api/device-action/OsUpdate/Shared/Substeps/GoToDashboard");vi.mock("@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion");vi.mock("@api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware");const r=(a,F={})=>({status:o.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:o.UserInteractionRequired.None,step:a,...F}}),h=()=>({status:o.DeviceActionStatus.Completed,output:void 0}),f=a=>({status:o.DeviceActionStatus.Error,error:a}),k=a=>(0,S.createMachine)({initial:"ready",states:{ready:{after:{0:"done"},entry:(0,S.assign)({intermediateValue:()=>({requiredUserInteraction:o.UserInteractionRequired.None})})},done:{type:"final"}},output:a}),v=a=>k(()=>a);describe("InstallOsUpdateDeviceAction",()=>{const a={isBootloader:!1,isOsu:!1,targetId:857735172,seTargetId:857735172,mcuTargetId:void 0,seVersion:"1.3.0",seFlags:new Uint8Array([230,0,0,0]),mcuSephVersion:"5.24",mcuBootloaderVersion:"0.48",hwVersion:"00",langId:0,recoverState:void 0,secureElementFlags:{isPinValidated:!0,hasMcuSerialNumber:!0,hasValidCertificate:!0,isCustomAuthorityConnectionAllowed:!1,isSecureConnectionAllowed:!1,isOnboarded:!0,isMcuCodeSigned:!0,isInRecoveryMode:!1}},F={osuFirmware:{id:200,notes:"Update notes",perso:"perso",firmware:"osu",firmwareKey:"osu-key",hash:"osu-hash",nextFinalFirmware:300},finalFirmware:{id:300,version:"1.4.0",perso:"perso",firmware:"final",firmwareKey:"final-key",hash:"final-hash",bytes:123,mcuVersions:[1]},shouldFlashMcu:!1};beforeEach(()=>{vi.resetAllMocks()});const u=(t="BOLOS")=>vi.mocked(I.waitForAppAndVersion).mockReturnValue(v((0,c.Right)({name:t,version:"1.0.0"}))),E=t=>{const n=[...t];vi.mocked(I.waitForAppAndVersion).mockReturnValue(k(()=>(0,c.Right)({name:n.shift()??"BOLOS",version:"1.0.0"})))},V=(t=(0,c.Right)(void 0))=>vi.mocked(y.goToDashboard).mockReturnValue(v(t)),m=(t=(0,c.Right)(a))=>vi.mocked(D.getOsVersion).mockReturnValue(()=>Promise.resolve(t)),A=(t=(0,w.of)())=>{const n=vi.fn().mockReturnValue(t);return vi.mocked(g.installFirmware).mockReturnValue(n),n},p=()=>new U.InstallOsUpdateDeviceAction({input:{osUpdate:F,unlockTimeout:3e4}});describe("Success",()=>{it("Should install the OSU firmware when the device is not in OSU mode",()=>new Promise((t,n)=>{u(),m();const s=A(),d=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GetDeviceInfo),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),h()];(0,l.testDeviceActionStates)(p(),d,(0,i.makeDeviceActionInternalApiMock)(),{onDone:()=>{expect(s).toHaveBeenCalledWith(expect.objectContaining({input:{deviceInfo:a,firmware:{perso:"perso",firmware:"osu",firmwareKey:"osu-key"}}})),t()},onError:n})})),it("Should install the final firmware when the device is in OSU mode",()=>new Promise((t,n)=>{u(),m((0,c.Right)({...a,isOsu:!0}));const s=A(),d=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GetDeviceInfo),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),h()];(0,l.testDeviceActionStates)(p(),d,(0,i.makeDeviceActionInternalApiMock)(),{onDone:()=>{expect(s).toHaveBeenCalledWith(expect.objectContaining({input:{deviceInfo:{...a,isOsu:!0},firmware:{perso:"perso",firmware:"final",firmwareKey:"final-key"}}})),t()},onError:n})})),it("Should only track progress while installing the final firmware",()=>new Promise((t,n)=>{u(),m((0,c.Right)({...a,isOsu:!0})),A((0,w.of)({type:o.SecureChannelEventType.PermissionRequested},{type:o.SecureChannelEventType.Progress,payload:{progress:.5,index:0,total:2}},{type:o.SecureChannelEventType.Progress,payload:{progress:1,index:1,total:2}}));const s=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GetDeviceInfo),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware,{progress:.5}),r(e.InstallOsUpdateSteps.InstallFirmware,{progress:1}),h()];(0,l.testDeviceActionStates)(p(),s,(0,i.makeDeviceActionInternalApiMock)(),{onDone:t,onError:n})})),it("Should go to dashboard and wait for app and version again when an app is open",()=>new Promise((t,n)=>{E(["Bitcoin","BOLOS"]),V(),m(),A();const s=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GoToDashboard),r(e.InstallOsUpdateSteps.GoToDashboard),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GetDeviceInfo),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),h()];(0,l.testDeviceActionStates)(p(),s,(0,i.makeDeviceActionInternalApiMock)(),{onDone:t,onError:n})})),it("Should request the secure connection permission then clear it once granted while installing the OSU",()=>new Promise((t,n)=>{u(),m(),A((0,w.of)({type:o.SecureChannelEventType.PermissionRequested},{type:o.SecureChannelEventType.PermissionGranted}));const s=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GetDeviceInfo),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware,{requiredUserInteraction:o.UserInteractionRequired.AllowSecureConnection}),r(e.InstallOsUpdateSteps.InstallFirmware),h()];(0,l.testDeviceActionStates)(p(),s,(0,i.makeDeviceActionInternalApiMock)(),{onDone:t,onError:n})})),it("Should report progress and request install confirmation on the last OSU APDU",()=>new Promise((t,n)=>{u(),m(),A((0,w.of)({type:o.SecureChannelEventType.Progress,payload:{progress:.99,index:0,total:2}},{type:o.SecureChannelEventType.Progress,payload:{progress:1,index:1,total:2}}));const s=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GetDeviceInfo),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware,{progress:.99,requiredUserInteraction:o.UserInteractionRequired.AllowInstallFirmware}),r(e.InstallOsUpdateSteps.InstallFirmware,{progress:1,requiredUserInteraction:o.UserInteractionRequired.None}),h()];(0,l.testDeviceActionStates)(p(),s,(0,i.makeDeviceActionInternalApiMock)(),{onDone:t,onError:n})}))}),describe("Error",()=>{it("Should go to Error when waitForAppAndVersion returns Left",()=>new Promise((t,n)=>{const s=new o.UnknownDAError("waitForAppAndVersion failed");vi.mocked(I.waitForAppAndVersion).mockReturnValue(v((0,c.Left)(s)));const d=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),f(s)];(0,l.testDeviceActionStates)(p(),d,(0,i.makeDeviceActionInternalApiMock)(),{onDone:t,onError:n})})),it("Should go to Error when goToDashboard returns Left",()=>new Promise((t,n)=>{u("Bitcoin");const s=new o.UnknownDAError("goToDashboard failed");V((0,c.Left)(s));const d=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GoToDashboard),r(e.InstallOsUpdateSteps.GoToDashboard),f(s)];(0,l.testDeviceActionStates)(p(),d,(0,i.makeDeviceActionInternalApiMock)(),{onDone:t,onError:n})})),it("Should go to Error when getOsVersion returns Left",()=>new Promise((t,n)=>{u();const s=new O.GetOsVersionError(new Error("command failed"));m((0,c.Left)(s));const d=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GetDeviceInfo),f(s)];(0,l.testDeviceActionStates)(p(),d,(0,i.makeDeviceActionInternalApiMock)(),{onDone:t,onError:n})})),it("Should map a secure channel error event to a device action error",()=>new Promise((t,n)=>{u(),m(),A((0,w.of)({type:o.SecureChannelEventType.Error,error:new o.SecureChannelError("install failed")}));const s=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GetDeviceInfo),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),f(new o.UnknownDAError)];(0,l.testDeviceActionStates)(p(),s,(0,i.makeDeviceActionInternalApiMock)(),{onDone:t,onError:n})})),it("Should go to Error when the secure channel connection cannot be opened",()=>new Promise((t,n)=>{u(),m();const s=new o.UnknownDAError("Invalid WebSocket connection");A(new w.Observable(W=>{W.error(s)}));const d=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GetDeviceInfo),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),f(s)];(0,l.testDeviceActionStates)(p(),d,(0,i.makeDeviceActionInternalApiMock)(),{onDone:t,onError:n})}))})});
1
+ "use strict";var n=require("@ledgerhq/device-management-kit"),c=require("purify-ts"),w=require("rxjs"),I=require("xstate"),i=require("../../../../device-action/__test-utils__/makeInternalApi"),l=require("../../../../device-action/__test-utils__/testDeviceActionStates"),V=require("../../../../device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors"),D=require("../../../../device-action/OsUpdate/Shared/Substeps/GetOsVersion"),y=require("../../../../device-action/OsUpdate/Shared/Substeps/GoToDashboard"),S=require("../../../../device-action/OsUpdate/Shared/Substeps/WaitForAppAndVersion"),g=require("../../../../device-action/OsUpdate/Update/InstallOsUpdate/InstallOsUpdateDeviceAction"),U=require("../../../../device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware"),e=require("../../../../device-action/OsUpdate/Update/InstallOsUpdate/types");vi.mock("@api/device-action/OsUpdate/Shared/Substeps/WaitForAppAndVersion");vi.mock("@api/device-action/OsUpdate/Shared/Substeps/GoToDashboard");vi.mock("@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion");vi.mock("@api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware");const r=(a,F={})=>({status:n.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:n.UserInteractionRequired.None,step:a,...F}}),f=()=>({status:n.DeviceActionStatus.Completed,output:void 0}),h=a=>({status:n.DeviceActionStatus.Error,error:a}),k=a=>(0,I.createMachine)({initial:"ready",states:{ready:{after:{0:"done"},entry:(0,I.assign)({intermediateValue:()=>({requiredUserInteraction:n.UserInteractionRequired.None})})},done:{type:"final"}},output:a}),v=a=>k(()=>a);describe("InstallOsUpdateDeviceAction",()=>{const a={isBootloader:!1,isOsu:!1,targetId:857735172,seTargetId:857735172,mcuTargetId:void 0,seVersion:"1.3.0",seFlags:new Uint8Array([230,0,0,0]),mcuSephVersion:"5.24",mcuBootloaderVersion:"0.48",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:n.SeedWordCount.TwentyFour,currentWordIndex:0,onboardingState:n.OnboardingState.Unknown}},F={osuFirmware:{id:200,notes:"Update notes",perso:"perso",firmware:"osu",firmwareKey:"osu-key",hash:"osu-hash",nextFinalFirmware:300},finalFirmware:{id:300,version:"1.4.0",perso:"perso",firmware:"final",firmwareKey:"final-key",hash:"final-hash",bytes:123,mcuVersions:[1]},shouldFlashMcu:!1};beforeEach(()=>{vi.resetAllMocks()});const u=(t="BOLOS")=>vi.mocked(S.waitForAppAndVersion).mockReturnValue(v((0,c.Right)({name:t,version:"1.0.0"}))),E=t=>{const o=[...t];vi.mocked(S.waitForAppAndVersion).mockReturnValue(k(()=>(0,c.Right)({name:o.shift()??"BOLOS",version:"1.0.0"})))},O=(t=(0,c.Right)(void 0))=>vi.mocked(y.goToDashboard).mockReturnValue(v(t)),m=(t=(0,c.Right)(a))=>vi.mocked(D.getOsVersion).mockReturnValue(()=>Promise.resolve(t)),A=(t=(0,w.of)())=>{const o=vi.fn().mockReturnValue(t);return vi.mocked(U.installFirmware).mockReturnValue(o),o},p=()=>new g.InstallOsUpdateDeviceAction({input:{osUpdate:F,unlockTimeout:3e4}});describe("Success",()=>{it("Should install the OSU firmware when the device is not in OSU mode",()=>new Promise((t,o)=>{u(),m();const s=A(),d=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GetDeviceInfo),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),f()];(0,l.testDeviceActionStates)(p(),d,(0,i.makeDeviceActionInternalApiMock)(),{onDone:()=>{expect(s).toHaveBeenCalledWith(expect.objectContaining({input:{deviceInfo:a,firmware:{perso:"perso",firmware:"osu",firmwareKey:"osu-key"}}})),t()},onError:o})})),it("Should install the final firmware when the device is in OSU mode",()=>new Promise((t,o)=>{u(),m((0,c.Right)({...a,isOsu:!0}));const s=A(),d=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GetDeviceInfo),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),f()];(0,l.testDeviceActionStates)(p(),d,(0,i.makeDeviceActionInternalApiMock)(),{onDone:()=>{expect(s).toHaveBeenCalledWith(expect.objectContaining({input:{deviceInfo:{...a,isOsu:!0},firmware:{perso:"perso",firmware:"final",firmwareKey:"final-key"}}})),t()},onError:o})})),it("Should only track progress while installing the final firmware",()=>new Promise((t,o)=>{u(),m((0,c.Right)({...a,isOsu:!0})),A((0,w.of)({type:n.SecureChannelEventType.PermissionRequested},{type:n.SecureChannelEventType.Progress,payload:{progress:.5,index:0,total:2}},{type:n.SecureChannelEventType.Progress,payload:{progress:1,index:1,total:2}}));const s=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GetDeviceInfo),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware,{progress:.5}),r(e.InstallOsUpdateSteps.InstallFirmware,{progress:1}),f()];(0,l.testDeviceActionStates)(p(),s,(0,i.makeDeviceActionInternalApiMock)(),{onDone:t,onError:o})})),it("Should go to dashboard and wait for app and version again when an app is open",()=>new Promise((t,o)=>{E(["Bitcoin","BOLOS"]),O(),m(),A();const s=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GoToDashboard),r(e.InstallOsUpdateSteps.GoToDashboard),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GetDeviceInfo),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),f()];(0,l.testDeviceActionStates)(p(),s,(0,i.makeDeviceActionInternalApiMock)(),{onDone:t,onError:o})})),it("Should request the secure connection permission then clear it once granted while installing the OSU",()=>new Promise((t,o)=>{u(),m(),A((0,w.of)({type:n.SecureChannelEventType.PermissionRequested},{type:n.SecureChannelEventType.PermissionGranted}));const s=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GetDeviceInfo),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware,{requiredUserInteraction:n.UserInteractionRequired.AllowSecureConnection}),r(e.InstallOsUpdateSteps.InstallFirmware),f()];(0,l.testDeviceActionStates)(p(),s,(0,i.makeDeviceActionInternalApiMock)(),{onDone:t,onError:o})})),it("Should report progress and request install confirmation on the last OSU APDU",()=>new Promise((t,o)=>{u(),m(),A((0,w.of)({type:n.SecureChannelEventType.Progress,payload:{progress:.99,index:0,total:2}},{type:n.SecureChannelEventType.Progress,payload:{progress:1,index:1,total:2}}));const s=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GetDeviceInfo),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware,{progress:.99,requiredUserInteraction:n.UserInteractionRequired.AllowInstallFirmware}),r(e.InstallOsUpdateSteps.InstallFirmware,{progress:1,requiredUserInteraction:n.UserInteractionRequired.None}),f()];(0,l.testDeviceActionStates)(p(),s,(0,i.makeDeviceActionInternalApiMock)(),{onDone:t,onError:o})}))}),describe("Error",()=>{it("Should go to Error when waitForAppAndVersion returns Left",()=>new Promise((t,o)=>{const s=new n.UnknownDAError("waitForAppAndVersion failed");vi.mocked(S.waitForAppAndVersion).mockReturnValue(v((0,c.Left)(s)));const d=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),h(s)];(0,l.testDeviceActionStates)(p(),d,(0,i.makeDeviceActionInternalApiMock)(),{onDone:t,onError:o})})),it("Should go to Error when goToDashboard returns Left",()=>new Promise((t,o)=>{u("Bitcoin");const s=new n.UnknownDAError("goToDashboard failed");O((0,c.Left)(s));const d=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GoToDashboard),r(e.InstallOsUpdateSteps.GoToDashboard),h(s)];(0,l.testDeviceActionStates)(p(),d,(0,i.makeDeviceActionInternalApiMock)(),{onDone:t,onError:o})})),it("Should go to Error when getOsVersion returns Left",()=>new Promise((t,o)=>{u();const s=new V.GetOsVersionError(new Error("command failed"));m((0,c.Left)(s));const d=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GetDeviceInfo),h(s)];(0,l.testDeviceActionStates)(p(),d,(0,i.makeDeviceActionInternalApiMock)(),{onDone:t,onError:o})})),it("Should map a secure channel error event to a device action error",()=>new Promise((t,o)=>{u(),m(),A((0,w.of)({type:n.SecureChannelEventType.Error,error:new n.SecureChannelError("install failed")}));const s=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GetDeviceInfo),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),h(new n.UnknownDAError)];(0,l.testDeviceActionStates)(p(),s,(0,i.makeDeviceActionInternalApiMock)(),{onDone:t,onError:o})})),it("Should go to Error when the secure channel connection cannot be opened",()=>new Promise((t,o)=>{u(),m();const s=new n.UnknownDAError("Invalid WebSocket connection");A(new w.Observable(W=>{W.error(s)}));const d=[r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.WaitForAppAndVersion),r(e.InstallOsUpdateSteps.GetDeviceInfo),r(e.InstallOsUpdateSteps.InstallFirmware),r(e.InstallOsUpdateSteps.InstallFirmware),h(s)];(0,l.testDeviceActionStates)(p(),d,(0,i.makeDeviceActionInternalApiMock)(),{onDone:t,onError:o})}))})});
2
2
  //# sourceMappingURL=InstallOsUpdateDeviceAction.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/api/device-action/OsUpdate/Update/InstallOsUpdate/InstallOsUpdateDeviceAction.test.ts"],
4
- "sourcesContent": ["import {\n DeviceActionStatus,\n type GetOsVersionResponse,\n SecureChannelError,\n SecureChannelEventType,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, Left, Right } from \"purify-ts\";\nimport { Observable, of } from \"rxjs\";\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 { GetOsVersionError } from \"@api/device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors\";\nimport { getOsVersion } from \"@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion\";\nimport { goToDashboard } from \"@api/device-action/OsUpdate/Shared/Substeps/GoToDashboard\";\nimport { waitForAppAndVersion } from \"@api/device-action/OsUpdate/Shared/Substeps/WaitForAppAndVersion\";\nimport { type OsUpdate } from \"@api/device-action/OsUpdate/Shared/types\";\nimport { InstallOsUpdateDeviceAction } from \"@api/device-action/OsUpdate/Update/InstallOsUpdate/InstallOsUpdateDeviceAction\";\nimport { installFirmware } from \"@api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware\";\nimport {\n type InstallOsUpdateDAError,\n type InstallOsUpdateDARequiredInteraction,\n type InstallOsUpdateDAState,\n InstallOsUpdateSteps,\n} from \"@api/device-action/OsUpdate/Update/InstallOsUpdate/types\";\n\nvi.mock(\"@api/device-action/OsUpdate/Shared/Substeps/WaitForAppAndVersion\");\nvi.mock(\"@api/device-action/OsUpdate/Shared/Substeps/GoToDashboard\");\nvi.mock(\"@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion\");\nvi.mock(\n \"@api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware\",\n);\n\nconst pendingState = (\n step: InstallOsUpdateSteps,\n intermediateValue: {\n requiredUserInteraction?: InstallOsUpdateDARequiredInteraction;\n progress?: number;\n } = {},\n): InstallOsUpdateDAState => ({\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step,\n ...intermediateValue,\n },\n});\n\nconst completedState = (): InstallOsUpdateDAState => ({\n status: DeviceActionStatus.Completed,\n output: undefined,\n});\n\nconst errorState = (error: InstallOsUpdateDAError): InstallOsUpdateDAState => ({\n status: DeviceActionStatus.Error,\n error,\n});\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\ndescribe(\"InstallOsUpdateDeviceAction\", () => {\n const getOsVersionResponse = {\n isBootloader: false,\n isOsu: false,\n targetId: 0x33200004,\n seTargetId: 0x33200004,\n mcuTargetId: undefined,\n seVersion: \"1.3.0\",\n seFlags: new Uint8Array([0xe6, 0x00, 0x00, 0x00]),\n mcuSephVersion: \"5.24\",\n mcuBootloaderVersion: \"0.48\",\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 },\n } satisfies GetOsVersionResponse;\n\n const osUpdate = {\n osuFirmware: {\n id: 200,\n notes: \"Update notes\",\n perso: \"perso\",\n firmware: \"osu\",\n firmwareKey: \"osu-key\",\n hash: \"osu-hash\",\n nextFinalFirmware: 300,\n },\n 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 },\n shouldFlashMcu: false,\n } satisfies OsUpdate;\n\n type SecureChannelEvents = ReturnType<ReturnType<typeof installFirmware>>;\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n const setupWaitForAppAndVersion = (appName = \"BOLOS\") =>\n vi.mocked(waitForAppAndVersion).mockReturnValue(\n createMockActorMachine(\n Right({\n name: appName,\n version: \"1.0.0\",\n }),\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 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 setupInstallFirmware = (events: SecureChannelEvents = of()) => {\n const handler = vi.fn().mockReturnValue(events);\n vi.mocked(installFirmware).mockReturnValue(handler);\n return handler;\n };\n\n const makeDeviceAction = () =>\n new InstallOsUpdateDeviceAction({\n input: {\n osUpdate,\n unlockTimeout: 30_000,\n },\n });\n\n describe(\"Success\", () => {\n it(\"Should install the OSU firmware when the device is not in OSU mode\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetOsVersion();\n const installFirmwareHandler = setupInstallFirmware();\n\n const expectedStates: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GetDeviceInfo),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n completedState(),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: () => {\n expect(installFirmwareHandler).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n deviceInfo: getOsVersionResponse,\n firmware: {\n perso: \"perso\",\n firmware: \"osu\",\n firmwareKey: \"osu-key\",\n },\n },\n }),\n );\n resolve();\n },\n onError: reject,\n },\n );\n }));\n\n it(\"Should install the final firmware when the device is in OSU mode\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetOsVersion(Right({ ...getOsVersionResponse, isOsu: true }));\n const installFirmwareHandler = setupInstallFirmware();\n\n const expectedStates: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GetDeviceInfo),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n completedState(),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: () => {\n expect(installFirmwareHandler).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n deviceInfo: { ...getOsVersionResponse, isOsu: true },\n firmware: {\n perso: \"perso\",\n firmware: \"final\",\n firmwareKey: \"final-key\",\n },\n },\n }),\n );\n resolve();\n },\n onError: reject,\n },\n );\n }));\n\n it(\"Should only track progress while installing the final firmware\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetOsVersion(Right({ ...getOsVersionResponse, isOsu: true }));\n setupInstallFirmware(\n of(\n { type: SecureChannelEventType.PermissionRequested },\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: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GetDeviceInfo),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware, { progress: 0.5 }),\n pendingState(InstallOsUpdateSteps.InstallFirmware, { progress: 1 }),\n completedState(),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\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 setupGetOsVersion();\n setupInstallFirmware();\n\n const expectedStates: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GoToDashboard),\n pendingState(InstallOsUpdateSteps.GoToDashboard),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GetDeviceInfo),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n completedState(),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"Should request the secure connection permission then clear it once granted while installing the OSU\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetOsVersion();\n setupInstallFirmware(\n of(\n { type: SecureChannelEventType.PermissionRequested },\n { type: SecureChannelEventType.PermissionGranted },\n ) as SecureChannelEvents,\n );\n\n const expectedStates: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GetDeviceInfo),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware, {\n requiredUserInteraction:\n UserInteractionRequired.AllowSecureConnection,\n }),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n completedState(),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"Should report progress and request install confirmation on the last OSU APDU\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetOsVersion();\n setupInstallFirmware(\n of(\n {\n type: SecureChannelEventType.Progress,\n payload: { progress: 0.99, 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: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GetDeviceInfo),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware, {\n progress: 0.99,\n requiredUserInteraction:\n UserInteractionRequired.AllowInstallFirmware,\n }),\n pendingState(InstallOsUpdateSteps.InstallFirmware, {\n progress: 1,\n requiredUserInteraction: UserInteractionRequired.None,\n }),\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 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: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.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: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GoToDashboard),\n pendingState(InstallOsUpdateSteps.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 getOsVersion returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n const error = new GetOsVersionError(new Error(\"command failed\"));\n setupGetOsVersion(Left(error));\n\n const expectedStates: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.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 map a secure channel error event to a device action error\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetOsVersion();\n setupInstallFirmware(\n of({\n type: SecureChannelEventType.Error,\n error: new SecureChannelError(\"install failed\"),\n }) as SecureChannelEvents,\n );\n\n const expectedStates: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GetDeviceInfo),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\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 setupWaitForAppAndVersion();\n setupGetOsVersion();\n const error = new UnknownDAError(\"Invalid WebSocket connection\");\n setupInstallFirmware(\n new Observable((subscriber) => {\n subscriber.error(error);\n }) as SecureChannelEvents,\n );\n\n const expectedStates: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GetDeviceInfo),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\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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",
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\";\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 { GetOsVersionError } from \"@api/device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors\";\nimport { getOsVersion } from \"@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion\";\nimport { goToDashboard } from \"@api/device-action/OsUpdate/Shared/Substeps/GoToDashboard\";\nimport { waitForAppAndVersion } from \"@api/device-action/OsUpdate/Shared/Substeps/WaitForAppAndVersion\";\nimport { type OsUpdate } from \"@api/device-action/OsUpdate/Shared/types\";\nimport { InstallOsUpdateDeviceAction } from \"@api/device-action/OsUpdate/Update/InstallOsUpdate/InstallOsUpdateDeviceAction\";\nimport { installFirmware } from \"@api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware\";\nimport {\n type InstallOsUpdateDAError,\n type InstallOsUpdateDARequiredInteraction,\n type InstallOsUpdateDAState,\n InstallOsUpdateSteps,\n} from \"@api/device-action/OsUpdate/Update/InstallOsUpdate/types\";\n\nvi.mock(\"@api/device-action/OsUpdate/Shared/Substeps/WaitForAppAndVersion\");\nvi.mock(\"@api/device-action/OsUpdate/Shared/Substeps/GoToDashboard\");\nvi.mock(\"@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion\");\nvi.mock(\n \"@api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware\",\n);\n\nconst pendingState = (\n step: InstallOsUpdateSteps,\n intermediateValue: {\n requiredUserInteraction?: InstallOsUpdateDARequiredInteraction;\n progress?: number;\n } = {},\n): InstallOsUpdateDAState => ({\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step,\n ...intermediateValue,\n },\n});\n\nconst completedState = (): InstallOsUpdateDAState => ({\n status: DeviceActionStatus.Completed,\n output: undefined,\n});\n\nconst errorState = (error: InstallOsUpdateDAError): InstallOsUpdateDAState => ({\n status: DeviceActionStatus.Error,\n error,\n});\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\ndescribe(\"InstallOsUpdateDeviceAction\", () => {\n const getOsVersionResponse = {\n isBootloader: false,\n isOsu: false,\n targetId: 0x33200004,\n seTargetId: 0x33200004,\n mcuTargetId: undefined,\n seVersion: \"1.3.0\",\n seFlags: new Uint8Array([0xe6, 0x00, 0x00, 0x00]),\n mcuSephVersion: \"5.24\",\n mcuBootloaderVersion: \"0.48\",\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 osUpdate = {\n osuFirmware: {\n id: 200,\n notes: \"Update notes\",\n perso: \"perso\",\n firmware: \"osu\",\n firmwareKey: \"osu-key\",\n hash: \"osu-hash\",\n nextFinalFirmware: 300,\n },\n 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 },\n shouldFlashMcu: false,\n } satisfies OsUpdate;\n\n type SecureChannelEvents = ReturnType<ReturnType<typeof installFirmware>>;\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n const setupWaitForAppAndVersion = (appName = \"BOLOS\") =>\n vi.mocked(waitForAppAndVersion).mockReturnValue(\n createMockActorMachine(\n Right({\n name: appName,\n version: \"1.0.0\",\n }),\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 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 setupInstallFirmware = (events: SecureChannelEvents = of()) => {\n const handler = vi.fn().mockReturnValue(events);\n vi.mocked(installFirmware).mockReturnValue(handler);\n return handler;\n };\n\n const makeDeviceAction = () =>\n new InstallOsUpdateDeviceAction({\n input: {\n osUpdate,\n unlockTimeout: 30_000,\n },\n });\n\n describe(\"Success\", () => {\n it(\"Should install the OSU firmware when the device is not in OSU mode\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetOsVersion();\n const installFirmwareHandler = setupInstallFirmware();\n\n const expectedStates: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GetDeviceInfo),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n completedState(),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: () => {\n expect(installFirmwareHandler).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n deviceInfo: getOsVersionResponse,\n firmware: {\n perso: \"perso\",\n firmware: \"osu\",\n firmwareKey: \"osu-key\",\n },\n },\n }),\n );\n resolve();\n },\n onError: reject,\n },\n );\n }));\n\n it(\"Should install the final firmware when the device is in OSU mode\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetOsVersion(Right({ ...getOsVersionResponse, isOsu: true }));\n const installFirmwareHandler = setupInstallFirmware();\n\n const expectedStates: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GetDeviceInfo),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n completedState(),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: () => {\n expect(installFirmwareHandler).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n deviceInfo: { ...getOsVersionResponse, isOsu: true },\n firmware: {\n perso: \"perso\",\n firmware: \"final\",\n firmwareKey: \"final-key\",\n },\n },\n }),\n );\n resolve();\n },\n onError: reject,\n },\n );\n }));\n\n it(\"Should only track progress while installing the final firmware\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetOsVersion(Right({ ...getOsVersionResponse, isOsu: true }));\n setupInstallFirmware(\n of(\n { type: SecureChannelEventType.PermissionRequested },\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: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GetDeviceInfo),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware, { progress: 0.5 }),\n pendingState(InstallOsUpdateSteps.InstallFirmware, { progress: 1 }),\n completedState(),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\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 setupGetOsVersion();\n setupInstallFirmware();\n\n const expectedStates: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GoToDashboard),\n pendingState(InstallOsUpdateSteps.GoToDashboard),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GetDeviceInfo),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n completedState(),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"Should request the secure connection permission then clear it once granted while installing the OSU\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetOsVersion();\n setupInstallFirmware(\n of(\n { type: SecureChannelEventType.PermissionRequested },\n { type: SecureChannelEventType.PermissionGranted },\n ) as SecureChannelEvents,\n );\n\n const expectedStates: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GetDeviceInfo),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware, {\n requiredUserInteraction:\n UserInteractionRequired.AllowSecureConnection,\n }),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n completedState(),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"Should report progress and request install confirmation on the last OSU APDU\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetOsVersion();\n setupInstallFirmware(\n of(\n {\n type: SecureChannelEventType.Progress,\n payload: { progress: 0.99, 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: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GetDeviceInfo),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware, {\n progress: 0.99,\n requiredUserInteraction:\n UserInteractionRequired.AllowInstallFirmware,\n }),\n pendingState(InstallOsUpdateSteps.InstallFirmware, {\n progress: 1,\n requiredUserInteraction: UserInteractionRequired.None,\n }),\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 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: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.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: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GoToDashboard),\n pendingState(InstallOsUpdateSteps.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 getOsVersion returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n const error = new GetOsVersionError(new Error(\"command failed\"));\n setupGetOsVersion(Left(error));\n\n const expectedStates: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.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 map a secure channel error event to a device action error\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetOsVersion();\n setupInstallFirmware(\n of({\n type: SecureChannelEventType.Error,\n error: new SecureChannelError(\"install failed\"),\n }) as SecureChannelEvents,\n );\n\n const expectedStates: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GetDeviceInfo),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\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 setupWaitForAppAndVersion();\n setupGetOsVersion();\n const error = new UnknownDAError(\"Invalid WebSocket connection\");\n setupInstallFirmware(\n new Observable((subscriber) => {\n subscriber.error(error);\n }) as SecureChannelEvents,\n );\n\n const expectedStates: InstallOsUpdateDAState[] = [\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.WaitForAppAndVersion),\n pendingState(InstallOsUpdateSteps.GetDeviceInfo),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\n pendingState(InstallOsUpdateSteps.InstallFirmware),\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
6
  "names": ["import_device_management_kit", "import_purify_ts", "import_rxjs", "import_xstate", "import_makeInternalApi", "import_testDeviceActionStates", "import_OsUpdateDeviceActionErrors", "import_GetOsVersion", "import_GoToDashboard", "import_WaitForAppAndVersion", "import_InstallOsUpdateDeviceAction", "import_InstallFirmware", "import_types", "pendingState", "step", "intermediateValue", "completedState", "errorState", "error", "createMockActorMachineFromOutput", "output", "createMockActorMachine", "getOsVersionResponse", "osUpdate", "setupWaitForAppAndVersion", "appName", "setupWaitForAppAndVersionSequence", "appNames", "remainingAppNames", "setupGoToDashboard", "setupGetOsVersion", "result", "setupInstallFirmware", "events", "handler", "makeDeviceAction", "resolve", "reject", "installFirmwareHandler", "expectedStates", "subscriber"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var n=require("purify-ts"),o=require("../../../../../device-action/__test-utils__/makeInternalApi"),a=require("../../../../../device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware");describe("InstallFirmware",()=>{const r=(0,o.makeDeviceActionInternalApiMock)(),{getSecureChannelService:s}=r,i={isBootloader:!1,isOsu:!1,targetId:857735172,seTargetId:857735172,mcuTargetId:void 0,seVersion:"1.3.0",seFlags:new Uint8Array([230,0,0,0]),mcuSephVersion:"5.24",mcuBootloaderVersion:"0.48",hwVersion:"00",langId:0,recoverState:void 0,secureElementFlags:{isPinValidated:!0,hasMcuSerialNumber:!0,hasValidCertificate:!0,isCustomAuthorityConnectionAllowed:!1,isSecureConnectionAllowed:!1,isOnboarded:!0,isMcuCodeSigned:!0,isInRecoveryMode:!1}},e=vi.fn();beforeEach(()=>{vi.resetAllMocks(),e.mockReturnValue((0,n.Right)({})),s.mockReturnValue({updateFirmware:e})}),it("Should open a secure channel with the OSU firmware payload",()=>{const t={perso:"perso",firmware:"osu",firmwareKey:"osu-key"};(0,a.installFirmware)(r)({input:{deviceInfo:i,firmware:t}}),expect(e).toHaveBeenCalledWith(i,t)})});
1
+ "use strict";var e=require("@ledgerhq/device-management-kit"),i=require("purify-ts"),a=require("../../../../../device-action/__test-utils__/makeInternalApi"),s=require("../../../../../device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware");describe("InstallFirmware",()=>{const n=(0,a.makeDeviceActionInternalApiMock)(),{getSecureChannelService:c}=n,t={isBootloader:!1,isOsu:!1,targetId:857735172,seTargetId:857735172,mcuTargetId:void 0,seVersion:"1.3.0",seFlags:new Uint8Array([230,0,0,0]),mcuSephVersion:"5.24",mcuBootloaderVersion:"0.48",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:e.SeedWordCount.TwentyFour,currentWordIndex:0,onboardingState:e.OnboardingState.Unknown}},r=vi.fn();beforeEach(()=>{vi.resetAllMocks(),r.mockReturnValue((0,i.Right)({})),c.mockReturnValue({updateFirmware:r})}),it("Should open a secure channel with the OSU firmware payload",()=>{const o={perso:"perso",firmware:"osu",firmwareKey:"osu-key"};(0,s.installFirmware)(n)({input:{deviceInfo:t,firmware:o}}),expect(r).toHaveBeenCalledWith(t,o)})});
2
2
  //# sourceMappingURL=InstallFirmware.test.js.map