@ledgerhq/dmk-ledger-wallet 0.0.0-develop-20260904001312 → 0.0.0-develop-20260906001532

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 (36) 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 +2 -2
  5. package/lib/cjs/api/device-action/OsUpdate/Shared/Substeps/GetOsVersion.test.js +1 -1
  6. package/lib/cjs/api/device-action/OsUpdate/Shared/Substeps/GetOsVersion.test.js.map +2 -2
  7. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js +1 -1
  8. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js.map +2 -2
  9. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu.test.js +1 -1
  10. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu.test.js.map +2 -2
  11. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js +1 -1
  12. package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js.map +2 -2
  13. package/lib/cjs/api/device-action/OsUpdate/Update/InstallOsUpdate/InstallOsUpdateDeviceAction.test.js +1 -1
  14. package/lib/cjs/api/device-action/OsUpdate/Update/InstallOsUpdate/InstallOsUpdateDeviceAction.test.js.map +2 -2
  15. package/lib/cjs/api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware.test.js +1 -1
  16. package/lib/cjs/api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware.test.js.map +2 -2
  17. package/lib/cjs/package.json +1 -1
  18. package/lib/esm/api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceAction.test.js +1 -1
  19. package/lib/esm/api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceAction.test.js.map +3 -3
  20. package/lib/esm/api/device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath.test.js +1 -1
  21. package/lib/esm/api/device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath.test.js.map +3 -3
  22. package/lib/esm/api/device-action/OsUpdate/Shared/Substeps/GetOsVersion.test.js +1 -1
  23. package/lib/esm/api/device-action/OsUpdate/Shared/Substeps/GetOsVersion.test.js.map +3 -3
  24. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js +1 -1
  25. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js.map +3 -3
  26. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu.test.js +1 -1
  27. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu.test.js.map +3 -3
  28. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js +1 -1
  29. package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js.map +3 -3
  30. package/lib/esm/api/device-action/OsUpdate/Update/InstallOsUpdate/InstallOsUpdateDeviceAction.test.js +1 -1
  31. package/lib/esm/api/device-action/OsUpdate/Update/InstallOsUpdate/InstallOsUpdateDeviceAction.test.js.map +3 -3
  32. package/lib/esm/api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware.test.js +1 -1
  33. package/lib/esm/api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware.test.js.map +3 -3
  34. package/lib/esm/package.json +1 -1
  35. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  36. package/package.json +6 -6
@@ -1,2 +1,2 @@
1
- "use strict";var n=require("@ledgerhq/device-management-kit"),i=require("purify-ts"),f=require("xstate"),p=require("../../../device-action/__test-utils__/makeInternalApi"),c=require("../../../device-action/__test-utils__/testDeviceActionStates"),R=require("../../../device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceAction"),U=require("../../../device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceActionErrors"),k=require("../../../device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath"),e=require("../../../device-action/OsUpdate/Resolve/types"),D=require("../../../device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors"),P=require("../../../device-action/OsUpdate/Shared/Substeps/GetOsVersion"),y=require("../../../device-action/OsUpdate/Shared/Substeps/GoToDashboard"),v=require("../../../device-action/OsUpdate/Shared/Substeps/WaitForAppAndVersion");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/Resolve/Substeps/ResolveOsUpdatePath");const o=a=>({status:n.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:n.UserInteractionRequired.None,step:a}}),S=a=>({status:n.DeviceActionStatus.Completed,output:a}),A=a=>({status:n.DeviceActionStatus.Error,error:a}),F=a=>(0,f.createMachine)({initial:"ready",states:{ready:{after:{0:"done"},entry:(0,f.assign)({intermediateValue:()=>({requiredUserInteraction:n.UserInteractionRequired.None})})},done:{type:"final"}},output:a}),w=a=>F(()=>a);describe("ResolveOsUpdatePathDeviceAction",()=>{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:24,currentWordIndex:0,onboardingState:n.OnboardingState.Unknown}},O=[{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 l=(t="BOLOS")=>vi.mocked(v.waitForAppAndVersion).mockReturnValue(w((0,i.Right)({name:t,version:"1.0.0"}))),g=t=>{const s=[...t];vi.mocked(v.waitForAppAndVersion).mockReturnValue(F(()=>(0,i.Right)({name:s.shift()??"BOLOS",version:"1.0.0"})))},V=(t=(0,i.Right)(void 0))=>vi.mocked(y.goToDashboard).mockReturnValue(w(t)),m=(t=(0,i.Right)(a))=>vi.mocked(P.getOsVersion).mockReturnValue(()=>Promise.resolve(t)),h=(t=(0,i.Right)(O))=>vi.mocked(k.resolveOsUpdatePath).mockReturnValue(()=>Promise.resolve(t)),u=()=>new R.ResolveOsUpdatePathDeviceAction({input:{unlockTimeout:3e4}});describe("Success",()=>{it("Should complete the resolve flow when the device is already on dashboard",()=>new Promise((t,s)=>{l(),m(),h();const r=[o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.GetOsVersion),o(e.ResolveOsUpdatePathSteps.ResolveOsUpdatePath),S(O)];(0,c.testDeviceActionStates)(u(),r,(0,p.makeDeviceActionInternalApiMock)(),{onDone:t,onError:s})})),it("Should go to dashboard and wait for app and version again when an app is open",()=>new Promise((t,s)=>{g(["Bitcoin","BOLOS"]),V(),m(),h();const r=[o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.GoToDashboard),o(e.ResolveOsUpdatePathSteps.GoToDashboard),o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.GetOsVersion),o(e.ResolveOsUpdatePathSteps.ResolveOsUpdatePath),S(O)];(0,c.testDeviceActionStates)(u(),r,(0,p.makeDeviceActionInternalApiMock)(),{onDone:t,onError:s})}))}),describe("Error",()=>{it("Should go to Error when waitForAppAndVersion returns Left",()=>new Promise((t,s)=>{const r=new n.UnknownDAError("waitForAppAndVersion failed");vi.mocked(v.waitForAppAndVersion).mockReturnValue(w((0,i.Left)(r)));const d=[o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),A(r)];(0,c.testDeviceActionStates)(u(),d,(0,p.makeDeviceActionInternalApiMock)(),{onDone:t,onError:s})})),it("Should go to Error when goToDashboard returns Left",()=>new Promise((t,s)=>{l("Bitcoin");const r=new n.UnknownDAError("goToDashboard failed");V((0,i.Left)(r));const d=[o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.GoToDashboard),o(e.ResolveOsUpdatePathSteps.GoToDashboard),A(r)];(0,c.testDeviceActionStates)(u(),d,(0,p.makeDeviceActionInternalApiMock)(),{onDone:t,onError:s})})),it("Should go to Error when getOsVersion returns Left",()=>new Promise((t,s)=>{l();const r=new D.GetOsVersionError(new Error("command failed"));m((0,i.Left)(r)),h();const d=[o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.GetOsVersion),A(r)];(0,c.testDeviceActionStates)(u(),d,(0,p.makeDeviceActionInternalApiMock)(),{onDone:t,onError:s})})),it("Should go to Error when resolveOsUpdatePath returns Left",()=>new Promise((t,s)=>{l(),m();const r=new U.ResolveOsUpdatePathError(new Error("manager api failed"));h((0,i.Left)(r));const d=[o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.GetOsVersion),o(e.ResolveOsUpdatePathSteps.ResolveOsUpdatePath),A(r)];(0,c.testDeviceActionStates)(u(),d,(0,p.makeDeviceActionInternalApiMock)(),{onDone:t,onError:s})}))})});
1
+ "use strict";var s=require("@ledgerhq/device-management-kit"),i=require("purify-ts"),f=require("xstate"),p=require("../../../device-action/__test-utils__/makeInternalApi"),c=require("../../../device-action/__test-utils__/testDeviceActionStates"),R=require("../../../device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceAction"),U=require("../../../device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceActionErrors"),k=require("../../../device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath"),e=require("../../../device-action/OsUpdate/Resolve/types"),D=require("../../../device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors"),P=require("../../../device-action/OsUpdate/Shared/Substeps/GetOsVersion"),y=require("../../../device-action/OsUpdate/Shared/Substeps/GoToDashboard"),v=require("../../../device-action/OsUpdate/Shared/Substeps/WaitForAppAndVersion");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/Resolve/Substeps/ResolveOsUpdatePath");const o=a=>({status:s.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:s.UserInteractionRequired.None,step:a}}),S=a=>({status:s.DeviceActionStatus.Completed,output:a}),A=a=>({status:s.DeviceActionStatus.Error,error:a}),F=a=>(0,f.createMachine)({initial:"ready",states:{ready:{after:{0:"done"},entry:(0,f.assign)({intermediateValue:()=>({requiredUserInteraction:s.UserInteractionRequired.None})})},done:{type:"final"}},output:a}),w=a=>F(()=>a);describe("ResolveOsUpdatePathDeviceAction",()=>{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:s.SeedWordCount.TwentyFour,currentWordIndex:0,onboardingState:s.OnboardingState.Unknown}},O=[{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 l=(t="BOLOS")=>vi.mocked(v.waitForAppAndVersion).mockReturnValue(w((0,i.Right)({name:t,version:"1.0.0"}))),g=t=>{const n=[...t];vi.mocked(v.waitForAppAndVersion).mockReturnValue(F(()=>(0,i.Right)({name:n.shift()??"BOLOS",version:"1.0.0"})))},V=(t=(0,i.Right)(void 0))=>vi.mocked(y.goToDashboard).mockReturnValue(w(t)),m=(t=(0,i.Right)(a))=>vi.mocked(P.getOsVersion).mockReturnValue(()=>Promise.resolve(t)),h=(t=(0,i.Right)(O))=>vi.mocked(k.resolveOsUpdatePath).mockReturnValue(()=>Promise.resolve(t)),u=()=>new R.ResolveOsUpdatePathDeviceAction({input:{unlockTimeout:3e4}});describe("Success",()=>{it("Should complete the resolve flow when the device is already on dashboard",()=>new Promise((t,n)=>{l(),m(),h();const r=[o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.GetOsVersion),o(e.ResolveOsUpdatePathSteps.ResolveOsUpdatePath),S(O)];(0,c.testDeviceActionStates)(u(),r,(0,p.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)=>{g(["Bitcoin","BOLOS"]),V(),m(),h();const r=[o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.GoToDashboard),o(e.ResolveOsUpdatePathSteps.GoToDashboard),o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.GetOsVersion),o(e.ResolveOsUpdatePathSteps.ResolveOsUpdatePath),S(O)];(0,c.testDeviceActionStates)(u(),r,(0,p.makeDeviceActionInternalApiMock)(),{onDone:t,onError:n})}))}),describe("Error",()=>{it("Should go to Error when waitForAppAndVersion returns Left",()=>new Promise((t,n)=>{const r=new s.UnknownDAError("waitForAppAndVersion failed");vi.mocked(v.waitForAppAndVersion).mockReturnValue(w((0,i.Left)(r)));const d=[o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),A(r)];(0,c.testDeviceActionStates)(u(),d,(0,p.makeDeviceActionInternalApiMock)(),{onDone:t,onError:n})})),it("Should go to Error when goToDashboard returns Left",()=>new Promise((t,n)=>{l("Bitcoin");const r=new s.UnknownDAError("goToDashboard failed");V((0,i.Left)(r));const d=[o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.GoToDashboard),o(e.ResolveOsUpdatePathSteps.GoToDashboard),A(r)];(0,c.testDeviceActionStates)(u(),d,(0,p.makeDeviceActionInternalApiMock)(),{onDone:t,onError:n})})),it("Should go to Error when getOsVersion returns Left",()=>new Promise((t,n)=>{l();const r=new D.GetOsVersionError(new Error("command failed"));m((0,i.Left)(r)),h();const d=[o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.GetOsVersion),A(r)];(0,c.testDeviceActionStates)(u(),d,(0,p.makeDeviceActionInternalApiMock)(),{onDone:t,onError:n})})),it("Should go to Error when resolveOsUpdatePath returns Left",()=>new Promise((t,n)=>{l(),m();const r=new U.ResolveOsUpdatePathError(new Error("manager api failed"));h((0,i.Left)(r));const d=[o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.WaitForAppAndVersion),o(e.ResolveOsUpdatePathSteps.GetOsVersion),o(e.ResolveOsUpdatePathSteps.ResolveOsUpdatePath),A(r)];(0,c.testDeviceActionStates)(u(),d,(0,p.makeDeviceActionInternalApiMock)(),{onDone:t,onError:n})}))})});
2
2
  //# sourceMappingURL=ResolveOsUpdatePathDeviceAction.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceAction.test.ts"],
4
- "sourcesContent": ["import {\n DeviceActionStatus,\n type GetOsVersionResponse,\n OnboardingState,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, Left, Right } from \"purify-ts\";\nimport { assign, createMachine } from \"xstate\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { testDeviceActionStates } from \"@api/device-action/__test-utils__/testDeviceActionStates\";\nimport { ResolveOsUpdatePathDeviceAction } from \"@api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceAction\";\nimport { ResolveOsUpdatePathError } from \"@api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceActionErrors\";\nimport { resolveOsUpdatePath } from \"@api/device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath\";\nimport {\n type ResolveOsUpdatePathDAError,\n type ResolveOsUpdatePathDAState,\n ResolveOsUpdatePathSteps,\n} from \"@api/device-action/OsUpdate/Resolve/types\";\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\";\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(\"@api/device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath\");\n\nconst pendingState = (\n step: ResolveOsUpdatePathSteps,\n): ResolveOsUpdatePathDAState => ({\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step,\n },\n});\n\nconst completedState = (output: OsUpdate[]): ResolveOsUpdatePathDAState => ({\n status: DeviceActionStatus.Completed,\n output,\n});\n\nconst errorState = (\n error: ResolveOsUpdatePathDAError,\n): ResolveOsUpdatePathDAState => ({\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(\"ResolveOsUpdatePathDeviceAction\", () => {\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: 24,\n currentWordIndex: 0,\n onboardingState: OnboardingState.Unknown,\n },\n } satisfies GetOsVersionResponse;\n\n const osUpdates = [\n {\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 },\n ] satisfies OsUpdate[];\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 setupResolveOsUpdatePath = (\n result: Either<unknown, OsUpdate[]> = Right(osUpdates),\n ) =>\n vi\n .mocked(resolveOsUpdatePath)\n .mockReturnValue(\n () =>\n Promise.resolve(result) as ReturnType<\n ReturnType<typeof resolveOsUpdatePath>\n >,\n );\n\n const makeDeviceAction = () =>\n new ResolveOsUpdatePathDeviceAction({\n input: {\n unlockTimeout: 30_000,\n },\n });\n\n describe(\"Success\", () => {\n it(\"Should complete the resolve flow when the device is already on dashboard\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetOsVersion();\n setupResolveOsUpdatePath();\n\n const expectedStates: ResolveOsUpdatePathDAState[] = [\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.GetOsVersion),\n pendingState(ResolveOsUpdatePathSteps.ResolveOsUpdatePath),\n completedState(osUpdates),\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 setupResolveOsUpdatePath();\n\n const expectedStates: ResolveOsUpdatePathDAState[] = [\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.GoToDashboard),\n pendingState(ResolveOsUpdatePathSteps.GoToDashboard),\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.GetOsVersion),\n pendingState(ResolveOsUpdatePathSteps.ResolveOsUpdatePath),\n completedState(osUpdates),\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: ResolveOsUpdatePathDAState[] = [\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.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: ResolveOsUpdatePathDAState[] = [\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.GoToDashboard),\n pendingState(ResolveOsUpdatePathSteps.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 setupResolveOsUpdatePath();\n\n const expectedStates: ResolveOsUpdatePathDAState[] = [\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.GetOsVersion),\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 resolveOsUpdatePath returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetOsVersion();\n const error = new ResolveOsUpdatePathError(\n new Error(\"manager api failed\"),\n );\n setupResolveOsUpdatePath(Left(error));\n\n const expectedStates: ResolveOsUpdatePathDAState[] = [\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.GetOsVersion),\n pendingState(ResolveOsUpdatePathSteps.ResolveOsUpdatePath),\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 SeedWordCount,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, Left, Right } from \"purify-ts\";\nimport { assign, createMachine } from \"xstate\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { testDeviceActionStates } from \"@api/device-action/__test-utils__/testDeviceActionStates\";\nimport { ResolveOsUpdatePathDeviceAction } from \"@api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceAction\";\nimport { ResolveOsUpdatePathError } from \"@api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceActionErrors\";\nimport { resolveOsUpdatePath } from \"@api/device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath\";\nimport {\n type ResolveOsUpdatePathDAError,\n type ResolveOsUpdatePathDAState,\n ResolveOsUpdatePathSteps,\n} from \"@api/device-action/OsUpdate/Resolve/types\";\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\";\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(\"@api/device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath\");\n\nconst pendingState = (\n step: ResolveOsUpdatePathSteps,\n): ResolveOsUpdatePathDAState => ({\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step,\n },\n});\n\nconst completedState = (output: OsUpdate[]): ResolveOsUpdatePathDAState => ({\n status: DeviceActionStatus.Completed,\n output,\n});\n\nconst errorState = (\n error: ResolveOsUpdatePathDAError,\n): ResolveOsUpdatePathDAState => ({\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(\"ResolveOsUpdatePathDeviceAction\", () => {\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 osUpdates = [\n {\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 },\n ] satisfies OsUpdate[];\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 setupResolveOsUpdatePath = (\n result: Either<unknown, OsUpdate[]> = Right(osUpdates),\n ) =>\n vi\n .mocked(resolveOsUpdatePath)\n .mockReturnValue(\n () =>\n Promise.resolve(result) as ReturnType<\n ReturnType<typeof resolveOsUpdatePath>\n >,\n );\n\n const makeDeviceAction = () =>\n new ResolveOsUpdatePathDeviceAction({\n input: {\n unlockTimeout: 30_000,\n },\n });\n\n describe(\"Success\", () => {\n it(\"Should complete the resolve flow when the device is already on dashboard\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetOsVersion();\n setupResolveOsUpdatePath();\n\n const expectedStates: ResolveOsUpdatePathDAState[] = [\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.GetOsVersion),\n pendingState(ResolveOsUpdatePathSteps.ResolveOsUpdatePath),\n completedState(osUpdates),\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 setupResolveOsUpdatePath();\n\n const expectedStates: ResolveOsUpdatePathDAState[] = [\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.GoToDashboard),\n pendingState(ResolveOsUpdatePathSteps.GoToDashboard),\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.GetOsVersion),\n pendingState(ResolveOsUpdatePathSteps.ResolveOsUpdatePath),\n completedState(osUpdates),\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: ResolveOsUpdatePathDAState[] = [\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.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: ResolveOsUpdatePathDAState[] = [\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.GoToDashboard),\n pendingState(ResolveOsUpdatePathSteps.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 setupResolveOsUpdatePath();\n\n const expectedStates: ResolveOsUpdatePathDAState[] = [\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.GetOsVersion),\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 resolveOsUpdatePath returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGetOsVersion();\n const error = new ResolveOsUpdatePathError(\n new Error(\"manager api failed\"),\n );\n setupResolveOsUpdatePath(Left(error));\n\n const expectedStates: ResolveOsUpdatePathDAState[] = [\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.WaitForAppAndVersion),\n pendingState(ResolveOsUpdatePathSteps.GetOsVersion),\n pendingState(ResolveOsUpdatePathSteps.ResolveOsUpdatePath),\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_xstate", "import_makeInternalApi", "import_testDeviceActionStates", "import_ResolveOsUpdatePathDeviceAction", "import_ResolveOsUpdatePathDeviceActionErrors", "import_ResolveOsUpdatePath", "import_types", "import_OsUpdateDeviceActionErrors", "import_GetOsVersion", "import_GoToDashboard", "import_WaitForAppAndVersion", "pendingState", "step", "completedState", "output", "errorState", "error", "createMockActorMachineFromOutput", "createMockActorMachine", "getOsVersionResponse", "osUpdates", "setupWaitForAppAndVersion", "appName", "setupWaitForAppAndVersionSequence", "appNames", "remainingAppNames", "setupGoToDashboard", "setupGetOsVersion", "result", "setupResolveOsUpdatePath", "makeDeviceAction", "resolve", "reject", "expectedStates"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var F=require("@ledgerhq/device-management-kit"),s=require("purify-ts"),h=require("../../../../device-action/__test-utils__/makeInternalApi"),w=require("../../../../device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceActionErrors"),c=require("../../../../device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath");const r=d=>(0,s.EitherAsync)(()=>Promise.resolve(d)),O=d=>(0,s.EitherAsync)(({throwE:n})=>Promise.resolve(n(d)));describe("ResolveOsUpdatePath",()=>{const n=(0,h.makeDeviceActionInternalApiMock)(),a={isBootloader:!1,isOsu:!1,targetId:857735172,seTargetId:857735172,mcuTargetId:void 0,seVersion:"1.3.0",seFlags:new Uint8Array([230,0,0,0]),mcuSephVersion:"1.0.0",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:24,currentWordIndex:0,onboardingState:F.OnboardingState.Unknown}},l={id:17,target_id:"857735172",name:"Ledger Stax"},V={id:100,version:"1.3.0",perso:"perso",firmware:null,firmwareKey:null,hash:null,bytes:null,mcuVersions:[1]},o={id:200,notes:"Update notes",perso:"perso",firmware:"osu",firmwareKey:"osu-key",hash:"osu-hash",nextFinalFirmware:300},f={...o,id:201,nextFinalFirmware:301},u={id:300,version:"1.4.0",perso:"perso",firmware:"final",firmwareKey:"final-key",hash:"final-hash",bytes:123,mcuVersions:[1]},p={...u,id:301,version:"1.5.0",mcuVersions:[3]},g=[{id:1,name:"1.0.0",fromBootloaderVersion:"0.0",providers:[1]},{id:3,name:"3.0.0",fromBootloaderVersion:"0.0",providers:[1,2]}],e={getMcuList:vi.fn(),getDeviceVersion:vi.fn(),getFirmwareVersion:vi.fn(),getOsuFirmwareVersion:vi.fn(),getLatestFirmwareVersion:vi.fn(),getNextFirmwareVersion:vi.fn(),getProvider:vi.fn()};beforeEach(()=>{vi.resetAllMocks(),n.getManagerApiService.mockReturnValue(e),e.getMcuList.mockReturnValue(r(g)),e.getDeviceVersion.mockReturnValue(r(l)),e.getFirmwareVersion.mockReturnValue(r(V)),e.getLatestFirmwareVersion.mockReturnValue(r((0,s.Just)(o))),e.getOsuFirmwareVersion.mockReturnValue(r(o)),e.getNextFirmwareVersion.mockReturnValue(r(u)),e.getProvider.mockReturnValue(1)}),describe("Success",()=>{it("Should return an empty update path when no firmware update is available",async()=>{e.getLatestFirmwareVersion.mockReturnValueOnce(r(s.Nothing));const t=await(0,c.resolveOsUpdatePath)(n)({input:{getOsVersionResponse:a}});expect(t.extract()).toEqual([]),expect(e.getDeviceVersion).toHaveBeenCalledWith(a),expect(e.getFirmwareVersion).toHaveBeenCalledWith(a,l),expect(e.getLatestFirmwareVersion).toHaveBeenCalledWith(V,l),expect(e.getNextFirmwareVersion).not.toHaveBeenCalled()}),it("Should resolve a single update without MCU flash when the final firmware supports the current MCU",async()=>{e.getLatestFirmwareVersion.mockReturnValueOnce(r((0,s.Just)(o))).mockReturnValueOnce(r(s.Nothing));const t=await(0,c.resolveOsUpdatePath)(n)({input:{getOsVersionResponse:a}});expect(t.extract()).toEqual([{osuFirmware:o,finalFirmware:u,shouldFlashMcu:!1}])}),it("Should resolve OSU mode from the OSU firmware endpoint",async()=>{e.getLatestFirmwareVersion.mockReturnValueOnce(r(s.Nothing));const t={...a,isOsu:!0},i=await(0,c.resolveOsUpdatePath)(n)({input:{getOsVersionResponse:t}});expect(i.extract()).toEqual([{osuFirmware:o,finalFirmware:u,shouldFlashMcu:!1}]),expect(e.getOsuFirmwareVersion).toHaveBeenCalledWith(t,l),expect(e.getFirmwareVersion).not.toHaveBeenCalled()}),it("Should resolve multiple updates and flag the one requiring an MCU flash",async()=>{e.getLatestFirmwareVersion.mockReturnValueOnce(r((0,s.Just)(o))).mockReturnValueOnce(r((0,s.Just)(f))).mockReturnValueOnce(r(s.Nothing)),e.getNextFirmwareVersion.mockReturnValueOnce(r(u)).mockReturnValueOnce(r(p));const t=await(0,c.resolveOsUpdatePath)(n)({input:{getOsVersionResponse:a}});expect(t.extract()).toEqual([{osuFirmware:o,finalFirmware:u,shouldFlashMcu:!1},{osuFirmware:f,finalFirmware:p,shouldFlashMcu:!0}]),expect(e.getDeviceVersion).toHaveBeenCalledTimes(1),expect(e.getLatestFirmwareVersion).toHaveBeenNthCalledWith(2,u,l)}),it("Should resolve the latest compatible MCU when MCU names are not strict semver",async()=>{const t=[{id:1,name:"1.0",fromBootloaderVersion:"0.0",providers:[1]},{id:2,name:"1.1",fromBootloaderVersion:"0.0",providers:[1,2]},{id:3,name:"1.2",fromBootloaderVersion:"0.0",providers:[1,2,3]}],i={...u,mcuVersions:[2,3]},m={...p,mcuVersions:[3]};e.getMcuList.mockReturnValueOnce(r(t)),e.getLatestFirmwareVersion.mockReturnValueOnce(r((0,s.Just)(o))).mockReturnValueOnce(r((0,s.Just)(f))).mockReturnValueOnce(r(s.Nothing)),e.getNextFirmwareVersion.mockReturnValueOnce(r(i)).mockReturnValueOnce(r(m));const v=await(0,c.resolveOsUpdatePath)(n)({input:{getOsVersionResponse:{...a,mcuSephVersion:"1.0"}}});expect(v.extract()).toEqual([{osuFirmware:o,finalFirmware:i,shouldFlashMcu:!0},{osuFirmware:f,finalFirmware:m,shouldFlashMcu:!1}])})}),describe("Error",()=>{it("Should return ResolveOsUpdatePathError when the MCU list cannot be fetched",async()=>{const t=new Error("mcu list failed");e.getMcuList.mockReturnValueOnce(O(t));const i=await(0,c.resolveOsUpdatePath)(n)({input:{getOsVersionResponse:a}});expect(i.isLeft()).toBe(!0),i.mapLeft(m=>{expect(m).toBeInstanceOf(w.ResolveOsUpdatePathError),expect(m.originalError).toBe(t)})}),it("Should return ResolveOsUpdatePathError when the current MCU version is unknown",async()=>{const t=await(0,c.resolveOsUpdatePath)(n)({input:{getOsVersionResponse:{...a,mcuSephVersion:"9.9.9"}}});expect(t.isLeft()).toBe(!0),t.mapLeft(i=>{expect(i).toBeInstanceOf(w.ResolveOsUpdatePathError),expect(i.originalError).toBe("No MCU firmware found for version 9.9.9")})}),it("Should return ResolveOsUpdatePathError when no compatible MCU can be resolved for the next firmware",async()=>{e.getNextFirmwareVersion.mockReturnValueOnce(r({...u,mcuVersions:[42]}));const t=await(0,c.resolveOsUpdatePath)(n)({input:{getOsVersionResponse:a}});expect(t.isLeft()).toBe(!0),t.mapLeft(i=>{expect(i).toBeInstanceOf(w.ResolveOsUpdatePathError),expect(i.originalError).toBe("No MCU firmware found for version null")})})})});
1
+ "use strict";var p=require("@ledgerhq/device-management-kit"),s=require("purify-ts"),h=require("../../../../device-action/__test-utils__/makeInternalApi"),w=require("../../../../device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceActionErrors"),c=require("../../../../device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath");const r=d=>(0,s.EitherAsync)(()=>Promise.resolve(d)),O=d=>(0,s.EitherAsync)(({throwE:n})=>Promise.resolve(n(d)));describe("ResolveOsUpdatePath",()=>{const n=(0,h.makeDeviceActionInternalApiMock)(),o={isBootloader:!1,isOsu:!1,targetId:857735172,seTargetId:857735172,mcuTargetId:void 0,seVersion:"1.3.0",seFlags:new Uint8Array([230,0,0,0]),mcuSephVersion:"1.0.0",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:p.SeedWordCount.TwentyFour,currentWordIndex:0,onboardingState:p.OnboardingState.Unknown}},l={id:17,target_id:"857735172",name:"Ledger Stax"},F={id:100,version:"1.3.0",perso:"perso",firmware:null,firmwareKey:null,hash:null,bytes:null,mcuVersions:[1]},a={id:200,notes:"Update notes",perso:"perso",firmware:"osu",firmwareKey:"osu-key",hash:"osu-hash",nextFinalFirmware:300},f={...a,id:201,nextFinalFirmware:301},u={id:300,version:"1.4.0",perso:"perso",firmware:"final",firmwareKey:"final-key",hash:"final-hash",bytes:123,mcuVersions:[1]},V={...u,id:301,version:"1.5.0",mcuVersions:[3]},g=[{id:1,name:"1.0.0",fromBootloaderVersion:"0.0",providers:[1]},{id:3,name:"3.0.0",fromBootloaderVersion:"0.0",providers:[1,2]}],e={getMcuList:vi.fn(),getDeviceVersion:vi.fn(),getFirmwareVersion:vi.fn(),getOsuFirmwareVersion:vi.fn(),getLatestFirmwareVersion:vi.fn(),getNextFirmwareVersion:vi.fn(),getProvider:vi.fn()};beforeEach(()=>{vi.resetAllMocks(),n.getManagerApiService.mockReturnValue(e),e.getMcuList.mockReturnValue(r(g)),e.getDeviceVersion.mockReturnValue(r(l)),e.getFirmwareVersion.mockReturnValue(r(F)),e.getLatestFirmwareVersion.mockReturnValue(r((0,s.Just)(a))),e.getOsuFirmwareVersion.mockReturnValue(r(a)),e.getNextFirmwareVersion.mockReturnValue(r(u)),e.getProvider.mockReturnValue(1)}),describe("Success",()=>{it("Should return an empty update path when no firmware update is available",async()=>{e.getLatestFirmwareVersion.mockReturnValueOnce(r(s.Nothing));const t=await(0,c.resolveOsUpdatePath)(n)({input:{getOsVersionResponse:o}});expect(t.extract()).toEqual([]),expect(e.getDeviceVersion).toHaveBeenCalledWith(o),expect(e.getFirmwareVersion).toHaveBeenCalledWith(o,l),expect(e.getLatestFirmwareVersion).toHaveBeenCalledWith(F,l),expect(e.getNextFirmwareVersion).not.toHaveBeenCalled()}),it("Should resolve a single update without MCU flash when the final firmware supports the current MCU",async()=>{e.getLatestFirmwareVersion.mockReturnValueOnce(r((0,s.Just)(a))).mockReturnValueOnce(r(s.Nothing));const t=await(0,c.resolveOsUpdatePath)(n)({input:{getOsVersionResponse:o}});expect(t.extract()).toEqual([{osuFirmware:a,finalFirmware:u,shouldFlashMcu:!1}])}),it("Should resolve OSU mode from the OSU firmware endpoint",async()=>{e.getLatestFirmwareVersion.mockReturnValueOnce(r(s.Nothing));const t={...o,isOsu:!0},i=await(0,c.resolveOsUpdatePath)(n)({input:{getOsVersionResponse:t}});expect(i.extract()).toEqual([{osuFirmware:a,finalFirmware:u,shouldFlashMcu:!1}]),expect(e.getOsuFirmwareVersion).toHaveBeenCalledWith(t,l),expect(e.getFirmwareVersion).not.toHaveBeenCalled()}),it("Should resolve multiple updates and flag the one requiring an MCU flash",async()=>{e.getLatestFirmwareVersion.mockReturnValueOnce(r((0,s.Just)(a))).mockReturnValueOnce(r((0,s.Just)(f))).mockReturnValueOnce(r(s.Nothing)),e.getNextFirmwareVersion.mockReturnValueOnce(r(u)).mockReturnValueOnce(r(V));const t=await(0,c.resolveOsUpdatePath)(n)({input:{getOsVersionResponse:o}});expect(t.extract()).toEqual([{osuFirmware:a,finalFirmware:u,shouldFlashMcu:!1},{osuFirmware:f,finalFirmware:V,shouldFlashMcu:!0}]),expect(e.getDeviceVersion).toHaveBeenCalledTimes(1),expect(e.getLatestFirmwareVersion).toHaveBeenNthCalledWith(2,u,l)}),it("Should resolve the latest compatible MCU when MCU names are not strict semver",async()=>{const t=[{id:1,name:"1.0",fromBootloaderVersion:"0.0",providers:[1]},{id:2,name:"1.1",fromBootloaderVersion:"0.0",providers:[1,2]},{id:3,name:"1.2",fromBootloaderVersion:"0.0",providers:[1,2,3]}],i={...u,mcuVersions:[2,3]},m={...V,mcuVersions:[3]};e.getMcuList.mockReturnValueOnce(r(t)),e.getLatestFirmwareVersion.mockReturnValueOnce(r((0,s.Just)(a))).mockReturnValueOnce(r((0,s.Just)(f))).mockReturnValueOnce(r(s.Nothing)),e.getNextFirmwareVersion.mockReturnValueOnce(r(i)).mockReturnValueOnce(r(m));const v=await(0,c.resolveOsUpdatePath)(n)({input:{getOsVersionResponse:{...o,mcuSephVersion:"1.0"}}});expect(v.extract()).toEqual([{osuFirmware:a,finalFirmware:i,shouldFlashMcu:!0},{osuFirmware:f,finalFirmware:m,shouldFlashMcu:!1}])})}),describe("Error",()=>{it("Should return ResolveOsUpdatePathError when the MCU list cannot be fetched",async()=>{const t=new Error("mcu list failed");e.getMcuList.mockReturnValueOnce(O(t));const i=await(0,c.resolveOsUpdatePath)(n)({input:{getOsVersionResponse:o}});expect(i.isLeft()).toBe(!0),i.mapLeft(m=>{expect(m).toBeInstanceOf(w.ResolveOsUpdatePathError),expect(m.originalError).toBe(t)})}),it("Should return ResolveOsUpdatePathError when the current MCU version is unknown",async()=>{const t=await(0,c.resolveOsUpdatePath)(n)({input:{getOsVersionResponse:{...o,mcuSephVersion:"9.9.9"}}});expect(t.isLeft()).toBe(!0),t.mapLeft(i=>{expect(i).toBeInstanceOf(w.ResolveOsUpdatePathError),expect(i.originalError).toBe("No MCU firmware found for version 9.9.9")})}),it("Should return ResolveOsUpdatePathError when no compatible MCU can be resolved for the next firmware",async()=>{e.getNextFirmwareVersion.mockReturnValueOnce(r({...u,mcuVersions:[42]}));const t=await(0,c.resolveOsUpdatePath)(n)({input:{getOsVersionResponse:o}});expect(t.isLeft()).toBe(!0),t.mapLeft(i=>{expect(i).toBeInstanceOf(w.ResolveOsUpdatePathError),expect(i.originalError).toBe("No MCU firmware found for version null")})})})});
2
2
  //# sourceMappingURL=ResolveOsUpdatePath.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/api/device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath.test.ts"],
4
- "sourcesContent": ["import {\n type GetOsVersionResponse,\n OnboardingState,\n} from \"@ledgerhq/device-management-kit\";\nimport { EitherAsync, Just, Nothing } from \"purify-ts\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { ResolveOsUpdatePathError } from \"@api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceActionErrors\";\nimport { resolveOsUpdatePath } from \"@api/device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath\";\nimport {\n type FinalFirmware,\n type McuFirmware,\n type OsuFirmware,\n} from \"@api/device-action/OsUpdate/Shared/types\";\n\nconst rightAsync = <T>(value: T) =>\n EitherAsync<unknown, T>(() => Promise.resolve(value));\n\nconst leftAsync = (error: unknown) =>\n EitherAsync<unknown, never>(({ throwE }) => Promise.resolve(throwE(error)));\n\ndescribe(\"ResolveOsUpdatePath\", () => {\n const DEFAULT_MANAGER_API_PROVIDER = 1;\n\n const apiMock = makeDeviceActionInternalApiMock();\n\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: \"1.0.0\",\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: 24,\n currentWordIndex: 0,\n onboardingState: OnboardingState.Unknown,\n },\n } satisfies GetOsVersionResponse;\n\n const deviceVersion = {\n id: 17,\n target_id: \"857735172\",\n name: \"Ledger Stax\",\n };\n\n const currentFirmware = {\n id: 100,\n version: \"1.3.0\",\n perso: \"perso\",\n firmware: null,\n firmwareKey: null,\n hash: null,\n bytes: null,\n mcuVersions: [1],\n } satisfies FinalFirmware;\n\n const firstOsuFirmware = {\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 } satisfies OsuFirmware;\n\n const secondOsuFirmware = {\n ...firstOsuFirmware,\n id: 201,\n nextFinalFirmware: 301,\n } satisfies OsuFirmware;\n\n const firstFinalFirmware = {\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 const secondFinalFirmware = {\n ...firstFinalFirmware,\n id: 301,\n version: \"1.5.0\",\n mcuVersions: [3],\n } satisfies FinalFirmware;\n\n const mcuList = [\n {\n id: 1,\n name: \"1.0.0\",\n fromBootloaderVersion: \"0.0\",\n providers: [1],\n },\n {\n id: 3,\n name: \"3.0.0\",\n fromBootloaderVersion: \"0.0\",\n providers: [1, 2],\n },\n ] satisfies McuFirmware[];\n\n const managerApiMock = {\n getMcuList: vi.fn(),\n getDeviceVersion: vi.fn(),\n getFirmwareVersion: vi.fn(),\n getOsuFirmwareVersion: vi.fn(),\n getLatestFirmwareVersion: vi.fn(),\n getNextFirmwareVersion: vi.fn(),\n getProvider: vi.fn(),\n };\n\n beforeEach(() => {\n vi.resetAllMocks();\n apiMock.getManagerApiService.mockReturnValue(managerApiMock as never);\n managerApiMock.getMcuList.mockReturnValue(rightAsync(mcuList));\n managerApiMock.getDeviceVersion.mockReturnValue(rightAsync(deviceVersion));\n managerApiMock.getFirmwareVersion.mockReturnValue(\n rightAsync(currentFirmware),\n );\n managerApiMock.getLatestFirmwareVersion.mockReturnValue(\n rightAsync(Just(firstOsuFirmware)),\n );\n managerApiMock.getOsuFirmwareVersion.mockReturnValue(\n rightAsync(firstOsuFirmware),\n );\n managerApiMock.getNextFirmwareVersion.mockReturnValue(\n rightAsync(firstFinalFirmware),\n );\n managerApiMock.getProvider.mockReturnValue(DEFAULT_MANAGER_API_PROVIDER);\n });\n\n describe(\"Success\", () => {\n it(\"Should return an empty update path when no firmware update is available\", async () => {\n managerApiMock.getLatestFirmwareVersion.mockReturnValueOnce(\n rightAsync(Nothing),\n );\n\n const result = await resolveOsUpdatePath(apiMock)({\n input: { getOsVersionResponse },\n });\n\n expect(result.extract()).toEqual([]);\n expect(managerApiMock.getDeviceVersion).toHaveBeenCalledWith(\n getOsVersionResponse,\n );\n expect(managerApiMock.getFirmwareVersion).toHaveBeenCalledWith(\n getOsVersionResponse,\n deviceVersion,\n );\n expect(managerApiMock.getLatestFirmwareVersion).toHaveBeenCalledWith(\n currentFirmware,\n deviceVersion,\n );\n expect(managerApiMock.getNextFirmwareVersion).not.toHaveBeenCalled();\n });\n\n it(\"Should resolve a single update without MCU flash when the final firmware supports the current MCU\", async () => {\n managerApiMock.getLatestFirmwareVersion\n .mockReturnValueOnce(rightAsync(Just(firstOsuFirmware)))\n .mockReturnValueOnce(rightAsync(Nothing));\n\n const result = await resolveOsUpdatePath(apiMock)({\n input: { getOsVersionResponse },\n });\n\n expect(result.extract()).toEqual([\n {\n osuFirmware: firstOsuFirmware,\n finalFirmware: firstFinalFirmware,\n shouldFlashMcu: false,\n },\n ]);\n });\n\n it(\"Should resolve OSU mode from the OSU firmware endpoint\", async () => {\n managerApiMock.getLatestFirmwareVersion.mockReturnValueOnce(\n rightAsync(Nothing),\n );\n\n const osVersionResponse = {\n ...getOsVersionResponse,\n isOsu: true,\n } satisfies GetOsVersionResponse;\n const result = await resolveOsUpdatePath(apiMock)({\n input: { getOsVersionResponse: osVersionResponse },\n });\n\n expect(result.extract()).toEqual([\n {\n osuFirmware: firstOsuFirmware,\n finalFirmware: firstFinalFirmware,\n shouldFlashMcu: false,\n },\n ]);\n expect(managerApiMock.getOsuFirmwareVersion).toHaveBeenCalledWith(\n osVersionResponse,\n deviceVersion,\n );\n expect(managerApiMock.getFirmwareVersion).not.toHaveBeenCalled();\n });\n\n it(\"Should resolve multiple updates and flag the one requiring an MCU flash\", async () => {\n managerApiMock.getLatestFirmwareVersion\n .mockReturnValueOnce(rightAsync(Just(firstOsuFirmware)))\n .mockReturnValueOnce(rightAsync(Just(secondOsuFirmware)))\n .mockReturnValueOnce(rightAsync(Nothing));\n managerApiMock.getNextFirmwareVersion\n .mockReturnValueOnce(rightAsync(firstFinalFirmware))\n .mockReturnValueOnce(rightAsync(secondFinalFirmware));\n\n const result = await resolveOsUpdatePath(apiMock)({\n input: { getOsVersionResponse },\n });\n\n expect(result.extract()).toEqual([\n {\n osuFirmware: firstOsuFirmware,\n finalFirmware: firstFinalFirmware,\n shouldFlashMcu: false,\n },\n {\n osuFirmware: secondOsuFirmware,\n finalFirmware: secondFinalFirmware,\n shouldFlashMcu: true,\n },\n ]);\n expect(managerApiMock.getDeviceVersion).toHaveBeenCalledTimes(1);\n expect(managerApiMock.getLatestFirmwareVersion).toHaveBeenNthCalledWith(\n 2,\n firstFinalFirmware,\n deviceVersion,\n );\n });\n\n it(\"Should resolve the latest compatible MCU when MCU names are not strict semver\", async () => {\n const managerMcuList = [\n {\n id: 1,\n name: \"1.0\",\n fromBootloaderVersion: \"0.0\",\n providers: [1],\n },\n {\n id: 2,\n name: \"1.1\",\n fromBootloaderVersion: \"0.0\",\n providers: [1, 2],\n },\n {\n id: 3,\n name: \"1.2\",\n fromBootloaderVersion: \"0.0\",\n providers: [1, 2, 3],\n },\n ] satisfies McuFirmware[];\n const finalFirmwareRequiringMcuFlash = {\n ...firstFinalFirmware,\n mcuVersions: [2, 3],\n } satisfies FinalFirmware;\n const finalFirmwareSupportingLatestMcu = {\n ...secondFinalFirmware,\n mcuVersions: [3],\n } satisfies FinalFirmware;\n\n managerApiMock.getMcuList.mockReturnValueOnce(rightAsync(managerMcuList));\n managerApiMock.getLatestFirmwareVersion\n .mockReturnValueOnce(rightAsync(Just(firstOsuFirmware)))\n .mockReturnValueOnce(rightAsync(Just(secondOsuFirmware)))\n .mockReturnValueOnce(rightAsync(Nothing));\n managerApiMock.getNextFirmwareVersion\n .mockReturnValueOnce(rightAsync(finalFirmwareRequiringMcuFlash))\n .mockReturnValueOnce(rightAsync(finalFirmwareSupportingLatestMcu));\n\n const result = await resolveOsUpdatePath(apiMock)({\n input: {\n getOsVersionResponse: {\n ...getOsVersionResponse,\n mcuSephVersion: \"1.0\",\n },\n },\n });\n\n expect(result.extract()).toEqual([\n {\n osuFirmware: firstOsuFirmware,\n finalFirmware: finalFirmwareRequiringMcuFlash,\n shouldFlashMcu: true,\n },\n {\n osuFirmware: secondOsuFirmware,\n finalFirmware: finalFirmwareSupportingLatestMcu,\n shouldFlashMcu: false,\n },\n ]);\n });\n });\n\n describe(\"Error\", () => {\n it(\"Should return ResolveOsUpdatePathError when the MCU list cannot be fetched\", async () => {\n const error = new Error(\"mcu list failed\");\n managerApiMock.getMcuList.mockReturnValueOnce(leftAsync(error));\n\n const result = await resolveOsUpdatePath(apiMock)({\n input: { getOsVersionResponse },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveOsUpdatePathError);\n expect(e.originalError).toBe(error);\n });\n });\n\n it(\"Should return ResolveOsUpdatePathError when the current MCU version is unknown\", async () => {\n const result = await resolveOsUpdatePath(apiMock)({\n input: {\n getOsVersionResponse: {\n ...getOsVersionResponse,\n mcuSephVersion: \"9.9.9\",\n },\n },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveOsUpdatePathError);\n expect(e.originalError).toBe(\"No MCU firmware found for version 9.9.9\");\n });\n });\n\n it(\"Should return ResolveOsUpdatePathError when no compatible MCU can be resolved for the next firmware\", async () => {\n managerApiMock.getNextFirmwareVersion.mockReturnValueOnce(\n rightAsync({\n ...firstFinalFirmware,\n mcuVersions: [42],\n }),\n );\n\n const result = await resolveOsUpdatePath(apiMock)({\n input: { getOsVersionResponse },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveOsUpdatePathError);\n expect(e.originalError).toBe(\"No MCU firmware found for version null\");\n });\n });\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n type GetOsVersionResponse,\n OnboardingState,\n SeedWordCount,\n} from \"@ledgerhq/device-management-kit\";\nimport { EitherAsync, Just, Nothing } from \"purify-ts\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { ResolveOsUpdatePathError } from \"@api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceActionErrors\";\nimport { resolveOsUpdatePath } from \"@api/device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath\";\nimport {\n type FinalFirmware,\n type McuFirmware,\n type OsuFirmware,\n} from \"@api/device-action/OsUpdate/Shared/types\";\n\nconst rightAsync = <T>(value: T) =>\n EitherAsync<unknown, T>(() => Promise.resolve(value));\n\nconst leftAsync = (error: unknown) =>\n EitherAsync<unknown, never>(({ throwE }) => Promise.resolve(throwE(error)));\n\ndescribe(\"ResolveOsUpdatePath\", () => {\n const DEFAULT_MANAGER_API_PROVIDER = 1;\n\n const apiMock = makeDeviceActionInternalApiMock();\n\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: \"1.0.0\",\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 deviceVersion = {\n id: 17,\n target_id: \"857735172\",\n name: \"Ledger Stax\",\n };\n\n const currentFirmware = {\n id: 100,\n version: \"1.3.0\",\n perso: \"perso\",\n firmware: null,\n firmwareKey: null,\n hash: null,\n bytes: null,\n mcuVersions: [1],\n } satisfies FinalFirmware;\n\n const firstOsuFirmware = {\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 } satisfies OsuFirmware;\n\n const secondOsuFirmware = {\n ...firstOsuFirmware,\n id: 201,\n nextFinalFirmware: 301,\n } satisfies OsuFirmware;\n\n const firstFinalFirmware = {\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 const secondFinalFirmware = {\n ...firstFinalFirmware,\n id: 301,\n version: \"1.5.0\",\n mcuVersions: [3],\n } satisfies FinalFirmware;\n\n const mcuList = [\n {\n id: 1,\n name: \"1.0.0\",\n fromBootloaderVersion: \"0.0\",\n providers: [1],\n },\n {\n id: 3,\n name: \"3.0.0\",\n fromBootloaderVersion: \"0.0\",\n providers: [1, 2],\n },\n ] satisfies McuFirmware[];\n\n const managerApiMock = {\n getMcuList: vi.fn(),\n getDeviceVersion: vi.fn(),\n getFirmwareVersion: vi.fn(),\n getOsuFirmwareVersion: vi.fn(),\n getLatestFirmwareVersion: vi.fn(),\n getNextFirmwareVersion: vi.fn(),\n getProvider: vi.fn(),\n };\n\n beforeEach(() => {\n vi.resetAllMocks();\n apiMock.getManagerApiService.mockReturnValue(managerApiMock as never);\n managerApiMock.getMcuList.mockReturnValue(rightAsync(mcuList));\n managerApiMock.getDeviceVersion.mockReturnValue(rightAsync(deviceVersion));\n managerApiMock.getFirmwareVersion.mockReturnValue(\n rightAsync(currentFirmware),\n );\n managerApiMock.getLatestFirmwareVersion.mockReturnValue(\n rightAsync(Just(firstOsuFirmware)),\n );\n managerApiMock.getOsuFirmwareVersion.mockReturnValue(\n rightAsync(firstOsuFirmware),\n );\n managerApiMock.getNextFirmwareVersion.mockReturnValue(\n rightAsync(firstFinalFirmware),\n );\n managerApiMock.getProvider.mockReturnValue(DEFAULT_MANAGER_API_PROVIDER);\n });\n\n describe(\"Success\", () => {\n it(\"Should return an empty update path when no firmware update is available\", async () => {\n managerApiMock.getLatestFirmwareVersion.mockReturnValueOnce(\n rightAsync(Nothing),\n );\n\n const result = await resolveOsUpdatePath(apiMock)({\n input: { getOsVersionResponse },\n });\n\n expect(result.extract()).toEqual([]);\n expect(managerApiMock.getDeviceVersion).toHaveBeenCalledWith(\n getOsVersionResponse,\n );\n expect(managerApiMock.getFirmwareVersion).toHaveBeenCalledWith(\n getOsVersionResponse,\n deviceVersion,\n );\n expect(managerApiMock.getLatestFirmwareVersion).toHaveBeenCalledWith(\n currentFirmware,\n deviceVersion,\n );\n expect(managerApiMock.getNextFirmwareVersion).not.toHaveBeenCalled();\n });\n\n it(\"Should resolve a single update without MCU flash when the final firmware supports the current MCU\", async () => {\n managerApiMock.getLatestFirmwareVersion\n .mockReturnValueOnce(rightAsync(Just(firstOsuFirmware)))\n .mockReturnValueOnce(rightAsync(Nothing));\n\n const result = await resolveOsUpdatePath(apiMock)({\n input: { getOsVersionResponse },\n });\n\n expect(result.extract()).toEqual([\n {\n osuFirmware: firstOsuFirmware,\n finalFirmware: firstFinalFirmware,\n shouldFlashMcu: false,\n },\n ]);\n });\n\n it(\"Should resolve OSU mode from the OSU firmware endpoint\", async () => {\n managerApiMock.getLatestFirmwareVersion.mockReturnValueOnce(\n rightAsync(Nothing),\n );\n\n const osVersionResponse = {\n ...getOsVersionResponse,\n isOsu: true,\n } satisfies GetOsVersionResponse;\n const result = await resolveOsUpdatePath(apiMock)({\n input: { getOsVersionResponse: osVersionResponse },\n });\n\n expect(result.extract()).toEqual([\n {\n osuFirmware: firstOsuFirmware,\n finalFirmware: firstFinalFirmware,\n shouldFlashMcu: false,\n },\n ]);\n expect(managerApiMock.getOsuFirmwareVersion).toHaveBeenCalledWith(\n osVersionResponse,\n deviceVersion,\n );\n expect(managerApiMock.getFirmwareVersion).not.toHaveBeenCalled();\n });\n\n it(\"Should resolve multiple updates and flag the one requiring an MCU flash\", async () => {\n managerApiMock.getLatestFirmwareVersion\n .mockReturnValueOnce(rightAsync(Just(firstOsuFirmware)))\n .mockReturnValueOnce(rightAsync(Just(secondOsuFirmware)))\n .mockReturnValueOnce(rightAsync(Nothing));\n managerApiMock.getNextFirmwareVersion\n .mockReturnValueOnce(rightAsync(firstFinalFirmware))\n .mockReturnValueOnce(rightAsync(secondFinalFirmware));\n\n const result = await resolveOsUpdatePath(apiMock)({\n input: { getOsVersionResponse },\n });\n\n expect(result.extract()).toEqual([\n {\n osuFirmware: firstOsuFirmware,\n finalFirmware: firstFinalFirmware,\n shouldFlashMcu: false,\n },\n {\n osuFirmware: secondOsuFirmware,\n finalFirmware: secondFinalFirmware,\n shouldFlashMcu: true,\n },\n ]);\n expect(managerApiMock.getDeviceVersion).toHaveBeenCalledTimes(1);\n expect(managerApiMock.getLatestFirmwareVersion).toHaveBeenNthCalledWith(\n 2,\n firstFinalFirmware,\n deviceVersion,\n );\n });\n\n it(\"Should resolve the latest compatible MCU when MCU names are not strict semver\", async () => {\n const managerMcuList = [\n {\n id: 1,\n name: \"1.0\",\n fromBootloaderVersion: \"0.0\",\n providers: [1],\n },\n {\n id: 2,\n name: \"1.1\",\n fromBootloaderVersion: \"0.0\",\n providers: [1, 2],\n },\n {\n id: 3,\n name: \"1.2\",\n fromBootloaderVersion: \"0.0\",\n providers: [1, 2, 3],\n },\n ] satisfies McuFirmware[];\n const finalFirmwareRequiringMcuFlash = {\n ...firstFinalFirmware,\n mcuVersions: [2, 3],\n } satisfies FinalFirmware;\n const finalFirmwareSupportingLatestMcu = {\n ...secondFinalFirmware,\n mcuVersions: [3],\n } satisfies FinalFirmware;\n\n managerApiMock.getMcuList.mockReturnValueOnce(rightAsync(managerMcuList));\n managerApiMock.getLatestFirmwareVersion\n .mockReturnValueOnce(rightAsync(Just(firstOsuFirmware)))\n .mockReturnValueOnce(rightAsync(Just(secondOsuFirmware)))\n .mockReturnValueOnce(rightAsync(Nothing));\n managerApiMock.getNextFirmwareVersion\n .mockReturnValueOnce(rightAsync(finalFirmwareRequiringMcuFlash))\n .mockReturnValueOnce(rightAsync(finalFirmwareSupportingLatestMcu));\n\n const result = await resolveOsUpdatePath(apiMock)({\n input: {\n getOsVersionResponse: {\n ...getOsVersionResponse,\n mcuSephVersion: \"1.0\",\n },\n },\n });\n\n expect(result.extract()).toEqual([\n {\n osuFirmware: firstOsuFirmware,\n finalFirmware: finalFirmwareRequiringMcuFlash,\n shouldFlashMcu: true,\n },\n {\n osuFirmware: secondOsuFirmware,\n finalFirmware: finalFirmwareSupportingLatestMcu,\n shouldFlashMcu: false,\n },\n ]);\n });\n });\n\n describe(\"Error\", () => {\n it(\"Should return ResolveOsUpdatePathError when the MCU list cannot be fetched\", async () => {\n const error = new Error(\"mcu list failed\");\n managerApiMock.getMcuList.mockReturnValueOnce(leftAsync(error));\n\n const result = await resolveOsUpdatePath(apiMock)({\n input: { getOsVersionResponse },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveOsUpdatePathError);\n expect(e.originalError).toBe(error);\n });\n });\n\n it(\"Should return ResolveOsUpdatePathError when the current MCU version is unknown\", async () => {\n const result = await resolveOsUpdatePath(apiMock)({\n input: {\n getOsVersionResponse: {\n ...getOsVersionResponse,\n mcuSephVersion: \"9.9.9\",\n },\n },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveOsUpdatePathError);\n expect(e.originalError).toBe(\"No MCU firmware found for version 9.9.9\");\n });\n });\n\n it(\"Should return ResolveOsUpdatePathError when no compatible MCU can be resolved for the next firmware\", async () => {\n managerApiMock.getNextFirmwareVersion.mockReturnValueOnce(\n rightAsync({\n ...firstFinalFirmware,\n mcuVersions: [42],\n }),\n );\n\n const result = await resolveOsUpdatePath(apiMock)({\n input: { getOsVersionResponse },\n });\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(ResolveOsUpdatePathError);\n expect(e.originalError).toBe(\"No MCU firmware found for version null\");\n });\n });\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_device_management_kit", "import_purify_ts", "import_makeInternalApi", "import_ResolveOsUpdatePathDeviceActionErrors", "import_ResolveOsUpdatePath", "rightAsync", "value", "leftAsync", "error", "throwE", "apiMock", "getOsVersionResponse", "deviceVersion", "currentFirmware", "firstOsuFirmware", "secondOsuFirmware", "firstFinalFirmware", "secondFinalFirmware", "mcuList", "managerApiMock", "result", "osVersionResponse", "managerMcuList", "finalFirmwareRequiringMcuFlash", "finalFirmwareSupportingLatestMcu", "e"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("@ledgerhq/device-management-kit"),a=require("../../../../device-action/__test-utils__/makeInternalApi"),c=require("../../../../device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors"),s=require("../../../../device-action/OsUpdate/Shared/Substeps/GetOsVersion");describe("GetOsVersion",()=>{const t=(0,a.makeDeviceActionInternalApiMock)(),{sendCommand:n}=t;beforeEach(()=>{vi.resetAllMocks()}),describe("Success",()=>{it("Should return the OS version response",async()=>{const r={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:24,currentWordIndex:0,onboardingState:e.OnboardingState.Unknown}};n.mockResolvedValueOnce((0,e.CommandResultFactory)({data:r}));const o=await(0,s.getOsVersion)(t)();expect(o.isRight()).toBe(!0),expect(o.extract()).toEqual(r)})}),describe("Error",()=>{it("Should return GetOsVersionError",async()=>{const r=new e.GlobalCommandError({errorCode:"6e00",...e.GLOBAL_ERRORS["6e00"]});n.mockResolvedValueOnce((0,e.CommandResultFactory)({error:r}));const o=await(0,s.getOsVersion)(t)();expect(o.isLeft()).toBe(!0),o.mapLeft(i=>{expect(i).toBeInstanceOf(c.GetOsVersionError),expect(i.originalError).toBe(r.originalError)})})})});
1
+ "use strict";var e=require("@ledgerhq/device-management-kit"),a=require("../../../../device-action/__test-utils__/makeInternalApi"),c=require("../../../../device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors"),n=require("../../../../device-action/OsUpdate/Shared/Substeps/GetOsVersion");describe("GetOsVersion",()=>{const t=(0,a.makeDeviceActionInternalApiMock)(),{sendCommand:s}=t;beforeEach(()=>{vi.resetAllMocks()}),describe("Success",()=>{it("Should return the OS version response",async()=>{const r={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}};s.mockResolvedValueOnce((0,e.CommandResultFactory)({data:r}));const o=await(0,n.getOsVersion)(t)();expect(o.isRight()).toBe(!0),expect(o.extract()).toEqual(r)})}),describe("Error",()=>{it("Should return GetOsVersionError",async()=>{const r=new e.GlobalCommandError({errorCode:"6e00",...e.GLOBAL_ERRORS["6e00"]});s.mockResolvedValueOnce((0,e.CommandResultFactory)({error:r}));const o=await(0,n.getOsVersion)(t)();expect(o.isLeft()).toBe(!0),o.mapLeft(i=>{expect(i).toBeInstanceOf(c.GetOsVersionError),expect(i.originalError).toBe(r.originalError)})})})});
2
2
  //# sourceMappingURL=GetOsVersion.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/api/device-action/OsUpdate/Shared/Substeps/GetOsVersion.test.ts"],
4
- "sourcesContent": ["import {\n CommandResultFactory,\n GLOBAL_ERRORS,\n GlobalCommandError,\n OnboardingState,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { GetOsVersionError } from \"@api/device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors\";\nimport { getOsVersion } from \"@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion\";\n\ndescribe(\"GetOsVersion\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n const { sendCommand: sendCommandMock } = apiMock;\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"Success\", () => {\n it(\"Should return the OS version response\", async () => {\n const osVersion = {\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: 24,\n currentWordIndex: 0,\n onboardingState: OnboardingState.Unknown,\n },\n };\n sendCommandMock.mockResolvedValueOnce(\n CommandResultFactory({ data: osVersion }),\n );\n\n const result = await getOsVersion(apiMock)();\n\n expect(result.isRight()).toBe(true);\n expect(result.extract()).toEqual(osVersion);\n });\n });\n\n describe(\"Error\", () => {\n it(\"Should return GetOsVersionError\", async () => {\n const error = new GlobalCommandError({\n errorCode: \"6e00\",\n ...GLOBAL_ERRORS[\"6e00\"],\n });\n sendCommandMock.mockResolvedValueOnce(CommandResultFactory({ error }));\n\n const result = await getOsVersion(apiMock)();\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(GetOsVersionError);\n expect(e.originalError).toBe(error.originalError);\n });\n });\n });\n});\n"],
5
- "mappings": "aAAA,IAAAA,EAKO,2CAEPC,EAAgD,6DAChDC,EAAkC,yEAClCC,EAA6B,oEAE7B,SAAS,eAAgB,IAAM,CAC7B,MAAMC,KAAU,mCAAgC,EAC1C,CAAE,YAAaC,CAAgB,EAAID,EAEzC,WAAW,IAAM,CACf,GAAG,cAAc,CACnB,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,wCAAyC,SAAY,CACtD,MAAME,EAAY,CAChB,aAAc,GACd,MAAO,GACP,SAAU,UACV,WAAY,UACZ,YAAa,OACb,UAAW,QACX,QAAS,IAAI,WAAW,CAAC,IAAM,EAAM,EAAM,CAAI,CAAC,EAChD,eAAgB,OAChB,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,GACf,iBAAkB,EAClB,gBAAiB,kBAAgB,OACnC,CACF,EACAD,EAAgB,yBACd,wBAAqB,CAAE,KAAMC,CAAU,CAAC,CAC1C,EAEA,MAAMC,EAAS,QAAM,gBAAaH,CAAO,EAAE,EAE3C,OAAOG,EAAO,QAAQ,CAAC,EAAE,KAAK,EAAI,EAClC,OAAOA,EAAO,QAAQ,CAAC,EAAE,QAAQD,CAAS,CAC5C,CAAC,CACH,CAAC,EAED,SAAS,QAAS,IAAM,CACtB,GAAG,kCAAmC,SAAY,CAChD,MAAME,EAAQ,IAAI,qBAAmB,CACnC,UAAW,OACX,GAAG,gBAAc,MAAM,CACzB,CAAC,EACDH,EAAgB,yBAAsB,wBAAqB,CAAE,MAAAG,CAAM,CAAC,CAAC,EAErE,MAAMD,EAAS,QAAM,gBAAaH,CAAO,EAAE,EAE3C,OAAOG,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,EACjCA,EAAO,QAASE,GAAM,CACpB,OAAOA,CAAC,EAAE,eAAe,mBAAiB,EAC1C,OAAOA,EAAE,aAAa,EAAE,KAAKD,EAAM,aAAa,CAClD,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC",
4
+ "sourcesContent": ["import {\n CommandResultFactory,\n GLOBAL_ERRORS,\n GlobalCommandError,\n OnboardingState,\n SeedWordCount,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { GetOsVersionError } from \"@api/device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors\";\nimport { getOsVersion } from \"@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion\";\n\ndescribe(\"GetOsVersion\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n const { sendCommand: sendCommandMock } = apiMock;\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"Success\", () => {\n it(\"Should return the OS version response\", async () => {\n const osVersion = {\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 };\n sendCommandMock.mockResolvedValueOnce(\n CommandResultFactory({ data: osVersion }),\n );\n\n const result = await getOsVersion(apiMock)();\n\n expect(result.isRight()).toBe(true);\n expect(result.extract()).toEqual(osVersion);\n });\n });\n\n describe(\"Error\", () => {\n it(\"Should return GetOsVersionError\", async () => {\n const error = new GlobalCommandError({\n errorCode: \"6e00\",\n ...GLOBAL_ERRORS[\"6e00\"],\n });\n sendCommandMock.mockResolvedValueOnce(CommandResultFactory({ error }));\n\n const result = await getOsVersion(apiMock)();\n\n expect(result.isLeft()).toBe(true);\n result.mapLeft((e) => {\n expect(e).toBeInstanceOf(GetOsVersionError);\n expect(e.originalError).toBe(error.originalError);\n });\n });\n });\n});\n"],
5
+ "mappings": "aAAA,IAAAA,EAMO,2CAEPC,EAAgD,6DAChDC,EAAkC,yEAClCC,EAA6B,oEAE7B,SAAS,eAAgB,IAAM,CAC7B,MAAMC,KAAU,mCAAgC,EAC1C,CAAE,YAAaC,CAAgB,EAAID,EAEzC,WAAW,IAAM,CACf,GAAG,cAAc,CACnB,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,wCAAyC,SAAY,CACtD,MAAME,EAAY,CAChB,aAAc,GACd,MAAO,GACP,SAAU,UACV,WAAY,UACZ,YAAa,OACb,UAAW,QACX,QAAS,IAAI,WAAW,CAAC,IAAM,EAAM,EAAM,CAAI,CAAC,EAChD,eAAgB,OAChB,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,EACAD,EAAgB,yBACd,wBAAqB,CAAE,KAAMC,CAAU,CAAC,CAC1C,EAEA,MAAMC,EAAS,QAAM,gBAAaH,CAAO,EAAE,EAE3C,OAAOG,EAAO,QAAQ,CAAC,EAAE,KAAK,EAAI,EAClC,OAAOA,EAAO,QAAQ,CAAC,EAAE,QAAQD,CAAS,CAC5C,CAAC,CACH,CAAC,EAED,SAAS,QAAS,IAAM,CACtB,GAAG,kCAAmC,SAAY,CAChD,MAAME,EAAQ,IAAI,qBAAmB,CACnC,UAAW,OACX,GAAG,gBAAc,MAAM,CACzB,CAAC,EACDH,EAAgB,yBAAsB,wBAAqB,CAAE,MAAAG,CAAM,CAAC,CAAC,EAErE,MAAMD,EAAS,QAAM,gBAAaH,CAAO,EAAE,EAE3C,OAAOG,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,EACjCA,EAAO,QAASE,GAAM,CACpB,OAAOA,CAAC,EAAE,eAAe,mBAAiB,EAC1C,OAAOA,EAAE,aAAa,EAAE,KAAKD,EAAM,aAAa,CAClD,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC",
6
6
  "names": ["import_device_management_kit", "import_makeInternalApi", "import_OsUpdateDeviceActionErrors", "import_GetOsVersion", "apiMock", "sendCommandMock", "osVersion", "result", "error", "e"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var n=require("@ledgerhq/device-management-kit"),c=require("purify-ts"),m=require("rxjs"),l=require("../../../../device-action/__test-utils__/makeInternalApi"),u=require("../../../../device-action/__test-utils__/testDeviceActionStates"),D=require("../../../../device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors"),V=require("../../../../device-action/OsUpdate/Shared/Substeps/GetOsVersion"),E=require("../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction"),S=require("../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors"),g=require("../../../../device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu"),O=require("../../../../device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion"),e=require("../../../../device-action/OsUpdate/Update/FlashMcu/types");vi.mock("@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion");vi.mock("@api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion");vi.mock("@api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu");const o=(a,M={})=>({status:n.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:n.UserInteractionRequired.None,step:a,...M}}),w=()=>({status:n.DeviceActionStatus.Completed,output:void 0}),f=a=>({status:n.DeviceActionStatus.Error,error:a}),y=a=>Array.from({length:a*2-1},()=>o(e.FlashMcuSteps.GetDeviceInfo));describe("FlashMcuDeviceAction",()=>{const a={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:24,currentWordIndex:0,onboardingState:n.OnboardingState.Unknown}},M={id:300,version:"1.4.0",perso:"perso",firmware:"final",firmwareKey:"final-key",hash:"final-hash",bytes:123,mcuVersions:[1]};beforeEach(()=>{vi.resetAllMocks()});const h=(r=(0,c.Right)(a))=>vi.mocked(V.getOsVersion).mockReturnValue(()=>Promise.resolve(r)),A=r=>{const t=[...r];vi.mocked(V.getOsVersion).mockReturnValue(()=>Promise.resolve(t.shift()??(0,c.Right)(a)))},p=(r=(0,c.Right)("1.12"))=>{const t=vi.fn().mockResolvedValue(r);return vi.mocked(O.resolveMcuVersion).mockReturnValue(t),t},v=(r=(0,m.of)())=>{const t=vi.fn().mockReturnValue(r);return vi.mocked(g.flashMcu).mockReturnValue(t),t},d=()=>new E.FlashMcuDeviceAction({input:{finalFirmware:M}});describe("Success",()=>{it("Should flash the MCU when the device is already in bootloader mode",()=>new Promise((r,t)=>{h();const s=p(),i=v(),F=[o(e.FlashMcuSteps.GetDeviceInfo),o(e.FlashMcuSteps.ResolveMcuVersion),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader),w()];(0,u.testDeviceActionStates)(d(),F,(0,l.makeDeviceActionInternalApiMock)(),{onDone:()=>{expect(s).toHaveBeenCalledWith(expect.objectContaining({input:{deviceInfo:a,finalFirmware:M}})),expect(i).toHaveBeenCalledWith(expect.objectContaining({input:{deviceInfo:a,version:"1.12"}})),r()},onError:t})})),it("Should poll until the device enters bootloader mode",async()=>{vi.useFakeTimers(),A([(0,c.Right)({...a,isBootloader:!1}),(0,c.Right)({...a,isBootloader:!1}),(0,c.Right)(a)]),p(),v();const r=[...y(3),o(e.FlashMcuSteps.ResolveMcuVersion),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader),w()],t=new Promise((s,i)=>{(0,u.testDeviceActionStates)(d(),r,(0,l.makeDeviceActionInternalApiMock)(),{onDone:s,onError:i})});await vi.advanceTimersByTimeAsync(2e3*3),await t,vi.useRealTimers()}),it("Should report the flash progress",()=>new Promise((r,t)=>{h(),p(),v((0,m.of)({type:n.SecureChannelEventType.Progress,payload:{progress:.5,index:0,total:2}},{type:n.SecureChannelEventType.Progress,payload:{progress:1,index:1,total:2}}));const s=[o(e.FlashMcuSteps.GetDeviceInfo),o(e.FlashMcuSteps.ResolveMcuVersion),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader,{progress:.5}),o(e.FlashMcuSteps.FlashMcuOrBootloader,{progress:1}),w()];(0,u.testDeviceActionStates)(d(),s,(0,l.makeDeviceActionInternalApiMock)(),{onDone:r,onError:t})}))}),describe("Error",()=>{it("Should go to Error when getOsVersion returns Left",()=>new Promise((r,t)=>{const s=new D.GetOsVersionError(new Error("command failed"));h((0,c.Left)(s));const i=[o(e.FlashMcuSteps.GetDeviceInfo),f(s)];(0,u.testDeviceActionStates)(d(),i,(0,l.makeDeviceActionInternalApiMock)(),{onDone:r,onError:t})})),it("Should go to Error when the device never enters bootloader mode",async()=>{vi.useFakeTimers(),h((0,c.Right)({...a,isBootloader:!1}));const r=[...y(10),f(new S.BootloaderModeTimeoutError("Device did not enter bootloader mode after 10 attempts"))],t=new Promise((s,i)=>{(0,u.testDeviceActionStates)(d(),r,(0,l.makeDeviceActionInternalApiMock)(),{onDone:s,onError:i})});await vi.advanceTimersByTimeAsync(2e3*11),await t,vi.useRealTimers()}),it("Should go to Error when resolveMcuVersion returns Left",()=>new Promise((r,t)=>{h();const s=new S.ResolveMcuVersionError("no compatible MCU");p((0,c.Left)(s));const i=[o(e.FlashMcuSteps.GetDeviceInfo),o(e.FlashMcuSteps.ResolveMcuVersion),f(s)];(0,u.testDeviceActionStates)(d(),i,(0,l.makeDeviceActionInternalApiMock)(),{onDone:r,onError:t})})),it("Should map a secure channel error event to a device action error",()=>new Promise((r,t)=>{h(),p(),v((0,m.of)({type:n.SecureChannelEventType.Error,error:new n.SecureChannelError("flash failed")}));const s=[o(e.FlashMcuSteps.GetDeviceInfo),o(e.FlashMcuSteps.ResolveMcuVersion),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader),f(new n.UnknownDAError)];(0,u.testDeviceActionStates)(d(),s,(0,l.makeDeviceActionInternalApiMock)(),{onDone:r,onError:t})})),it("Should go to Error when the secure channel connection cannot be opened",()=>new Promise((r,t)=>{h(),p();const s=new n.UnknownDAError("Invalid WebSocket connection");v(new m.Observable(F=>{F.error(s)}));const i=[o(e.FlashMcuSteps.GetDeviceInfo),o(e.FlashMcuSteps.ResolveMcuVersion),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader),f(s)];(0,u.testDeviceActionStates)(d(),i,(0,l.makeDeviceActionInternalApiMock)(),{onDone:r,onError:t})}))})});
1
+ "use strict";var n=require("@ledgerhq/device-management-kit"),c=require("purify-ts"),m=require("rxjs"),l=require("../../../../device-action/__test-utils__/makeInternalApi"),u=require("../../../../device-action/__test-utils__/testDeviceActionStates"),D=require("../../../../device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors"),V=require("../../../../device-action/OsUpdate/Shared/Substeps/GetOsVersion"),E=require("../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction"),M=require("../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors"),g=require("../../../../device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu"),O=require("../../../../device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion"),e=require("../../../../device-action/OsUpdate/Update/FlashMcu/types");vi.mock("@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion");vi.mock("@api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion");vi.mock("@api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu");const o=(a,S={})=>({status:n.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:n.UserInteractionRequired.None,step:a,...S}}),w=()=>({status:n.DeviceActionStatus.Completed,output:void 0}),f=a=>({status:n.DeviceActionStatus.Error,error:a}),y=a=>Array.from({length:a*2-1},()=>o(e.FlashMcuSteps.GetDeviceInfo));describe("FlashMcuDeviceAction",()=>{const a={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:n.SeedWordCount.TwentyFour,currentWordIndex:0,onboardingState:n.OnboardingState.Unknown}},S={id:300,version:"1.4.0",perso:"perso",firmware:"final",firmwareKey:"final-key",hash:"final-hash",bytes:123,mcuVersions:[1]};beforeEach(()=>{vi.resetAllMocks()});const h=(r=(0,c.Right)(a))=>vi.mocked(V.getOsVersion).mockReturnValue(()=>Promise.resolve(r)),A=r=>{const t=[...r];vi.mocked(V.getOsVersion).mockReturnValue(()=>Promise.resolve(t.shift()??(0,c.Right)(a)))},p=(r=(0,c.Right)("1.12"))=>{const t=vi.fn().mockResolvedValue(r);return vi.mocked(O.resolveMcuVersion).mockReturnValue(t),t},v=(r=(0,m.of)())=>{const t=vi.fn().mockReturnValue(r);return vi.mocked(g.flashMcu).mockReturnValue(t),t},d=()=>new E.FlashMcuDeviceAction({input:{finalFirmware:S}});describe("Success",()=>{it("Should flash the MCU when the device is already in bootloader mode",()=>new Promise((r,t)=>{h();const s=p(),i=v(),F=[o(e.FlashMcuSteps.GetDeviceInfo),o(e.FlashMcuSteps.ResolveMcuVersion),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader),w()];(0,u.testDeviceActionStates)(d(),F,(0,l.makeDeviceActionInternalApiMock)(),{onDone:()=>{expect(s).toHaveBeenCalledWith(expect.objectContaining({input:{deviceInfo:a,finalFirmware:S}})),expect(i).toHaveBeenCalledWith(expect.objectContaining({input:{deviceInfo:a,version:"1.12"}})),r()},onError:t})})),it("Should poll until the device enters bootloader mode",async()=>{vi.useFakeTimers(),A([(0,c.Right)({...a,isBootloader:!1}),(0,c.Right)({...a,isBootloader:!1}),(0,c.Right)(a)]),p(),v();const r=[...y(3),o(e.FlashMcuSteps.ResolveMcuVersion),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader),w()],t=new Promise((s,i)=>{(0,u.testDeviceActionStates)(d(),r,(0,l.makeDeviceActionInternalApiMock)(),{onDone:s,onError:i})});await vi.advanceTimersByTimeAsync(2e3*3),await t,vi.useRealTimers()}),it("Should report the flash progress",()=>new Promise((r,t)=>{h(),p(),v((0,m.of)({type:n.SecureChannelEventType.Progress,payload:{progress:.5,index:0,total:2}},{type:n.SecureChannelEventType.Progress,payload:{progress:1,index:1,total:2}}));const s=[o(e.FlashMcuSteps.GetDeviceInfo),o(e.FlashMcuSteps.ResolveMcuVersion),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader,{progress:.5}),o(e.FlashMcuSteps.FlashMcuOrBootloader,{progress:1}),w()];(0,u.testDeviceActionStates)(d(),s,(0,l.makeDeviceActionInternalApiMock)(),{onDone:r,onError:t})}))}),describe("Error",()=>{it("Should go to Error when getOsVersion returns Left",()=>new Promise((r,t)=>{const s=new D.GetOsVersionError(new Error("command failed"));h((0,c.Left)(s));const i=[o(e.FlashMcuSteps.GetDeviceInfo),f(s)];(0,u.testDeviceActionStates)(d(),i,(0,l.makeDeviceActionInternalApiMock)(),{onDone:r,onError:t})})),it("Should go to Error when the device never enters bootloader mode",async()=>{vi.useFakeTimers(),h((0,c.Right)({...a,isBootloader:!1}));const r=[...y(10),f(new M.BootloaderModeTimeoutError("Device did not enter bootloader mode after 10 attempts"))],t=new Promise((s,i)=>{(0,u.testDeviceActionStates)(d(),r,(0,l.makeDeviceActionInternalApiMock)(),{onDone:s,onError:i})});await vi.advanceTimersByTimeAsync(2e3*11),await t,vi.useRealTimers()}),it("Should go to Error when resolveMcuVersion returns Left",()=>new Promise((r,t)=>{h();const s=new M.ResolveMcuVersionError("no compatible MCU");p((0,c.Left)(s));const i=[o(e.FlashMcuSteps.GetDeviceInfo),o(e.FlashMcuSteps.ResolveMcuVersion),f(s)];(0,u.testDeviceActionStates)(d(),i,(0,l.makeDeviceActionInternalApiMock)(),{onDone:r,onError:t})})),it("Should map a secure channel error event to a device action error",()=>new Promise((r,t)=>{h(),p(),v((0,m.of)({type:n.SecureChannelEventType.Error,error:new n.SecureChannelError("flash failed")}));const s=[o(e.FlashMcuSteps.GetDeviceInfo),o(e.FlashMcuSteps.ResolveMcuVersion),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader),f(new n.UnknownDAError)];(0,u.testDeviceActionStates)(d(),s,(0,l.makeDeviceActionInternalApiMock)(),{onDone:r,onError:t})})),it("Should go to Error when the secure channel connection cannot be opened",()=>new Promise((r,t)=>{h(),p();const s=new n.UnknownDAError("Invalid WebSocket connection");v(new m.Observable(F=>{F.error(s)}));const i=[o(e.FlashMcuSteps.GetDeviceInfo),o(e.FlashMcuSteps.ResolveMcuVersion),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader),f(s)];(0,u.testDeviceActionStates)(d(),i,(0,l.makeDeviceActionInternalApiMock)(),{onDone:r,onError:t})}))})});
2
2
  //# sourceMappingURL=FlashMcuDeviceAction.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.ts"],
4
- "sourcesContent": ["import {\n DeviceActionStatus,\n type GetOsVersionResponse,\n OnboardingState,\n SecureChannelError,\n SecureChannelEventType,\n 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 hasEndorsementCertificateInSlot1: false,\n hasEndorsementCertificateInSlot2: false,\n numberOfWords: 24,\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 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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",
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 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 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
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"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var r=require("@ledgerhq/device-management-kit"),o=require("purify-ts"),s=require("../../../../../device-action/__test-utils__/makeInternalApi"),i=require("../../../../../device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu");describe("FlashMcu",()=>{const n=(0,s.makeDeviceActionInternalApiMock)(),{getSecureChannelService:a}=n,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:24,currentWordIndex:0,onboardingState:r.OnboardingState.Unknown}},e=vi.fn();beforeEach(()=>{vi.resetAllMocks(),e.mockReturnValue((0,o.Right)({})),a.mockReturnValue({updateMcu:e})}),it("Should open a secure channel with the resolved MCU version",()=>{(0,i.flashMcu)(n)({input:{deviceInfo:t,version:"1.12"}}),expect(e).toHaveBeenCalledWith(t,{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 OnboardingState,\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: 24,\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,EAIO,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,GACf,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",
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
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 p=require("@ledgerhq/device-management-kit"),u=require("purify-ts"),f=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,f.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,hasEndorsementCertificateInSlot1:!1,hasEndorsementCertificateInSlot2:!1,numberOfWords:24,currentWordIndex:0,onboardingState:p.OnboardingState.Unknown}},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 c=require("@ledgerhq/device-management-kit"),d=require("purify-ts"),f=require("../../../../../device-action/__test-utils__/makeInternalApi"),m=require("../../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors"),t=require("../../../../../device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion");describe("ResolveMcuVersion",()=>{const r=(0,f.makeDeviceActionInternalApiMock)(),{getManagerApiService:p}=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,hasEndorsementCertificateInSlot1:!1,hasEndorsementCertificateInSlot2:!1,numberOfWords:c.SeedWordCount.TwentyFour,currentWordIndex:0,onboardingState:c.OnboardingState.Unknown}},i={id:300,version:"1.4.0",perso:"perso",firmware:"final",firmwareKey:"final-key",hash:"final-hash",bytes:123,mcuVersions:[1,2]},l=vi.fn(),u=vi.fn();beforeEach(()=>{vi.resetAllMocks(),u.mockReturnValue(1),p.mockReturnValue({getMcuList:l,getProvider:u})});const s=e=>l.mockReturnValue((0,d.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(p).not.toHaveBeenCalled()}),it("Should return the MCU name when the device is already at its starting bootloader version",async()=>{u.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");l.mockReturnValue((0,d.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(m.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(m.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 OnboardingState,\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: 24,\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 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": "aAAA,IAAAA,EAIO,2CACPC,EAA4B,qBAE5BC,EAAgD,6DAEhDC,EAAuC,kFACvCC,EAAkC,kFAElC,SAAS,oBAAqB,IAAM,CAElC,MAAMC,KAAU,mCAAgC,EAC1C,CAAE,qBAAsBC,CAAyB,EAAID,EAErDE,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,GACf,iBAAkB,EAClB,gBAAiB,kBAAgB,OACnC,CACF,EAEMC,EAAgB,CACpB,GAAI,IACJ,QAAS,QACT,MAAO,QACP,SAAU,QACV,YAAa,YACb,KAAM,aACN,MAAO,IACP,YAAa,CAAC,EAAG,CAAC,CACpB,EAEMC,EAAiB,GAAG,GAAG,EACvBC,EAAkB,GAAG,GAAG,EAE9B,WAAW,IAAM,CACf,GAAG,cAAc,EACjBA,EAAgB,gBAAgB,CAA4B,EAC5DJ,EAAyB,gBAAgB,CACvC,WAAYG,EACZ,YAAaC,CACf,CAA+D,CACjE,CAAC,EAED,MAAMC,EACJC,GAMGH,EAAe,mBAAgB,eAAY,IAAM,QAAQ,QAAQG,CAAI,CAAC,CAAC,EAE5E,SAAS,UAAW,IAAM,CACxB,GAAG,KAAK,CACN,CAAC,MAAO,KAAK,EACb,CAAC,MAAO,KAAK,EACb,CAAC,MAAO,KAAK,EACb,CAAC,MAAO,KAAK,CACf,CAAC,EACC,yEACA,MAAOC,EAAsBC,IAAoB,CAC/C,MAAMC,EAAS,QAAM,qBAAkBV,CAAO,EAAE,CAC9C,MAAO,CACL,WAAY,CAAE,GAAGE,EAAY,qBAAAM,CAAqB,EAClD,cAAAL,CACF,CACF,CAAC,EAED,OAAOO,EAAO,QAAQ,CAAC,EAAE,KAAKD,CAAe,EAC7C,OAAOR,CAAwB,EAAE,IAAI,iBAAiB,CACxD,CACF,EAEA,GAAG,2FAA4F,SAAY,CACzGI,EAAgB,gBAAgB,EAAE,EAClCC,EAAa,CACX,CACE,GAAI,EACJ,KAAM,OACN,sBAAuB,OACvB,UAAW,CAAC,EAAE,CAChB,CACF,CAAC,EAED,MAAMI,EAAS,QAAM,qBAAkBV,CAAO,EAAE,CAC9C,MAAO,CAAE,WAAAE,EAAY,cAAAC,CAAc,CACrC,CAAC,EAED,OAAOO,EAAO,QAAQ,CAAC,EAAE,KAAK,MAAM,CACtC,CAAC,EAED,GAAG,iFAAkF,SAAY,CAC/FJ,EAAa,CACX,CACE,GAAI,EACJ,KAAM,OACN,sBAAuB,OACvB,UAAW,CAAC,CAAC,CACf,CACF,CAAC,EAED,MAAMI,EAAS,QAAM,qBAAkBV,CAAO,EAAE,CAC9C,MAAO,CAAE,WAAAE,EAAY,cAAAC,CAAc,CACrC,CAAC,EAED,OAAOO,EAAO,QAAQ,CAAC,EAAE,KAAK,MAAM,CACtC,CAAC,EAED,GAAG,yEAA0E,SAAY,CACvFJ,EAAa,CACX,CACE,GAAI,EACJ,KAAM,OACN,sBAAuB,OACvB,UAAW,CAAC,CAAC,CACf,EACA,CACE,GAAI,EACJ,KAAM,OACN,sBAAuB,OACvB,UAAW,CAAC,CAAC,CACf,EACA,CACE,GAAI,EACJ,KAAM,OACN,sBAAuB,OACvB,UAAW,CAAC,CAAC,CACf,CACF,CAAC,EAED,MAAMI,EAAS,QAAM,qBAAkBV,CAAO,EAAE,CAC9C,MAAO,CAAE,WAAAE,EAAY,cAAAC,CAAc,CACrC,CAAC,EAED,OAAOO,EAAO,QAAQ,CAAC,EAAE,KAAK,MAAM,CACtC,CAAC,CACH,CAAC,EAED,SAAS,QAAS,IAAM,CACtB,GAAG,6EAA8E,SAAY,CAC3F,MAAMC,EAAQ,IAAI,MAAM,iBAAiB,EACzCP,EAAe,mBACb,eAAY,IAAM,QAAQ,OAAOO,CAAK,CAAC,CACzC,EAEA,MAAMD,EAAS,QAAM,qBAAkBV,CAAO,EAAE,CAC9C,MAAO,CAAE,WAAAE,EAAY,cAAAC,CAAc,CACrC,CAAC,EAED,OAAOO,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,EACjCA,EAAO,QAASE,GAAM,CACpB,OAAOA,CAAC,EAAE,eAAe,wBAAsB,EAC/C,OAAOA,EAAE,aAAa,EAAE,KAAKD,CAAK,CACpC,CAAC,CACH,CAAC,EAED,GAAG,yEAA0E,SAAY,CACvFL,EAAa,CACX,CACE,GAAI,GACJ,KAAM,OACN,sBAAuB,OACvB,UAAW,CAAC,CAAC,CACf,CACF,CAAC,EAED,MAAMI,EAAS,QAAM,qBAAkBV,CAAO,EAAE,CAC9C,MAAO,CAAE,WAAAE,EAAY,cAAAC,CAAc,CACrC,CAAC,EAED,OAAOO,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,EACjCA,EAAO,QAASE,GAAM,CACpB,OAAOA,CAAC,EAAE,eAAe,wBAAsB,CACjD,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC",
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 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
6
  "names": ["import_device_management_kit", "import_purify_ts", "import_makeInternalApi", "import_FlashMcuDeviceActionErrors", "import_ResolveMcuVersion", "apiMock", "getManagerApiServiceMock", "deviceInfo", "finalFirmware", "getMcuListMock", "getProviderMock", "setupMcuList", "mcus", "mcuBootloaderVersion", "expectedVersion", "result", "error", "e"]
7
7
  }