@ledgerhq/dmk-ledger-wallet 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceAction.test.js +1 -1
- package/lib/cjs/api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceAction.test.js.map +2 -2
- package/lib/cjs/api/device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath.test.js +1 -1
- package/lib/cjs/api/device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath.test.js.map +3 -3
- package/lib/cjs/api/device-action/OsUpdate/Shared/OsUpdateUtils.js +1 -1
- package/lib/cjs/api/device-action/OsUpdate/Shared/OsUpdateUtils.js.map +3 -3
- package/lib/cjs/api/device-action/OsUpdate/Shared/Substeps/GetOsVersion.test.js +1 -1
- package/lib/cjs/api/device-action/OsUpdate/Shared/Substeps/GetOsVersion.test.js.map +2 -2
- package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.js +1 -1
- package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.js.map +2 -2
- package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js +1 -1
- package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js.map +3 -3
- package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu.test.js +1 -1
- package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu.test.js.map +3 -3
- package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.js +1 -1
- package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.js.map +3 -3
- package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js +1 -1
- package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js.map +3 -3
- package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/types.js +1 -1
- package/lib/cjs/api/device-action/OsUpdate/Update/FlashMcu/types.js.map +2 -2
- package/lib/cjs/api/device-action/OsUpdate/Update/InstallOsUpdate/InstallOsUpdateDeviceAction.test.js +1 -1
- package/lib/cjs/api/device-action/OsUpdate/Update/InstallOsUpdate/InstallOsUpdateDeviceAction.test.js.map +2 -2
- package/lib/cjs/api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware.test.js +1 -1
- package/lib/cjs/api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware.test.js.map +3 -3
- package/lib/cjs/package.json +2 -2
- package/lib/esm/api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceAction.test.js +1 -1
- package/lib/esm/api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceAction.test.js.map +3 -3
- package/lib/esm/api/device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath.test.js +1 -1
- package/lib/esm/api/device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath.test.js.map +3 -3
- package/lib/esm/api/device-action/OsUpdate/Shared/OsUpdateUtils.js +1 -1
- package/lib/esm/api/device-action/OsUpdate/Shared/OsUpdateUtils.js.map +3 -3
- package/lib/esm/api/device-action/OsUpdate/Shared/Substeps/GetOsVersion.test.js +1 -1
- package/lib/esm/api/device-action/OsUpdate/Shared/Substeps/GetOsVersion.test.js.map +3 -3
- package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.js +1 -1
- package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.js.map +2 -2
- package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js +1 -1
- package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.test.js.map +3 -3
- package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu.test.js +1 -1
- package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu.test.js.map +3 -3
- package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.js +1 -1
- package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.js.map +3 -3
- package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js +1 -1
- package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.test.js.map +3 -3
- package/lib/esm/api/device-action/OsUpdate/Update/FlashMcu/types.js.map +2 -2
- package/lib/esm/api/device-action/OsUpdate/Update/InstallOsUpdate/InstallOsUpdateDeviceAction.test.js +1 -1
- package/lib/esm/api/device-action/OsUpdate/Update/InstallOsUpdate/InstallOsUpdateDeviceAction.test.js.map +3 -3
- package/lib/esm/api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware.test.js +1 -1
- package/lib/esm/api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware.test.js.map +3 -3
- package/lib/esm/package.json +2 -2
- package/lib/types/api/device-action/OsUpdate/Shared/OsUpdateUtils.d.ts +2 -0
- package/lib/types/api/device-action/OsUpdate/Shared/OsUpdateUtils.d.ts.map +1 -1
- package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.d.ts.map +1 -1
- package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.d.ts +2 -3
- package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion.d.ts.map +1 -1
- package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/types.d.ts +3 -0
- package/lib/types/api/device-action/OsUpdate/Update/FlashMcu/types.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +5 -5
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
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
|
package/lib/cjs/api/device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceAction.test.js.map
CHANGED
|
@@ -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 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 },\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": "aAAA,IAAAA,
|
|
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 s=require("purify-ts"),
|
|
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 { type GetOsVersionResponse } 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 },\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": "
|
|
6
|
-
"names": ["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"]
|
|
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
|
+
"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 t=Object.defineProperty;var
|
|
1
|
+
"use strict";var t=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var F=Object.prototype.hasOwnProperty;var f=(n,r)=>{for(var o in r)t(n,o,{get:r[o],enumerable:!0})},p=(n,r,o,e)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of d(r))!F.call(n,s)&&s!==o&&t(n,s,{get:()=>r[s],enumerable:!(e=m(r,s))||e.enumerable});return n};var w=n=>p(t({},"__esModule",{value:!0}),n);var E={};f(E,{bestCompatibleMcu:()=>M,bestMcuForBootloaderVersion:()=>v,isSameBootloaderVersion:()=>a});module.exports=w(E);var i=require("semver");const c=1,u=new Set(["none","noneee","rien",""]),a=(n,r)=>{const o=(0,i.coerce)(n)?.version,e=(0,i.coerce)(r)?.version;return o!==void 0&&e!==void 0?o===e:n===r},l=n=>n.reduce((r,o)=>{const e=(0,i.coerce)(o.name)?.version;return e&&(!r||(0,i.compare)(e,r.version)>0)?{...o,version:e}:r},null),M=(n,r,o=c)=>l(n.filter(e=>r.mcuVersions.includes(e.id)&&e.providers.includes(o)&&!u.has(e.fromBootloaderVersion))),v=(n,r,o=c)=>l(n.filter(e=>e.providers.includes(o)&&!u.has(e.fromBootloaderVersion)&&a(e.fromBootloaderVersion,r)));0&&(module.exports={bestCompatibleMcu,bestMcuForBootloaderVersion,isSameBootloaderVersion});
|
|
2
2
|
//# sourceMappingURL=OsUpdateUtils.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/api/device-action/OsUpdate/Shared/OsUpdateUtils.ts"],
|
|
4
|
-
"sourcesContent": ["import { coerce, compare } from \"semver\";\n\nimport {\n type FinalFirmware,\n type McuFirmware,\n} from \"@api/device-action/OsUpdate/Shared/types\";\n\nconst DEFAULT_MANAGER_API_PROVIDER = 1;\n\n/*\n * List of from_bootloader_versions that are excluded.\n */\nconst EXCLUDED_FROM_BOOTLOADER_VERSIONS = new Set([\n \"none\",\n \"noneee\",\n \"rien\",\n \"\",\n]);\n\nexport const
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,IAAA,eAAAC,
|
|
6
|
-
"names": ["OsUpdateUtils_exports", "__export", "bestCompatibleMcu", "__toCommonJS", "import_semver", "DEFAULT_MANAGER_API_PROVIDER", "EXCLUDED_FROM_BOOTLOADER_VERSIONS", "
|
|
4
|
+
"sourcesContent": ["import { coerce, compare } from \"semver\";\n\nimport {\n type FinalFirmware,\n type McuFirmware,\n} from \"@api/device-action/OsUpdate/Shared/types\";\n\nconst DEFAULT_MANAGER_API_PROVIDER = 1;\n\n/*\n * List of from_bootloader_versions that are excluded.\n */\nconst EXCLUDED_FROM_BOOTLOADER_VERSIONS = new Set([\n \"none\",\n \"noneee\",\n \"rien\",\n \"\",\n]);\n\n/*\n * The MCU catalog and the devices do not agree on how many segments a\n * bootloader version has (\"1.16\" against \"1.16.0\"), so compare them coerced and\n * only fall back to the raw strings when either side is not valid semver.\n */\nexport const isSameBootloaderVersion = (\n bootloaderVersion: string,\n otherBootloaderVersion: string,\n): boolean => {\n const coerced = coerce(bootloaderVersion)?.version;\n const otherCoerced = coerce(otherBootloaderVersion)?.version;\n\n return coerced !== undefined && otherCoerced !== undefined\n ? coerced === otherCoerced\n : bootloaderVersion === otherBootloaderVersion;\n};\n\nconst highestMcu = (mcuList: McuFirmware[]): McuFirmware | null =>\n mcuList.reduce<(McuFirmware & { version: string }) | null>(\n (latestMcu, mcu) => {\n const version = coerce(mcu.name)?.version;\n\n if (!version) {\n return latestMcu;\n }\n\n if (!latestMcu || compare(version, latestMcu.version) > 0) {\n return {\n ...mcu,\n version,\n };\n }\n\n return latestMcu;\n },\n null,\n );\n\nexport const bestCompatibleMcu = (\n mcuList: McuFirmware[],\n finalFirmware: FinalFirmware,\n provider: number = DEFAULT_MANAGER_API_PROVIDER,\n): McuFirmware | null =>\n highestMcu(\n mcuList.filter(\n (mcu) =>\n finalFirmware.mcuVersions.includes(mcu.id) &&\n mcu.providers.includes(provider) &&\n !EXCLUDED_FROM_BOOTLOADER_VERSIONS.has(mcu.fromBootloaderVersion),\n ),\n );\n\n/*\n * Fallback for devices that report no secure element firmware: without a final\n * firmware to aim at, the only usable hint is the bootloader they start from.\n */\nexport const bestMcuForBootloaderVersion = (\n mcuList: McuFirmware[],\n bootloaderVersion: string,\n provider: number = DEFAULT_MANAGER_API_PROVIDER,\n): McuFirmware | null =>\n highestMcu(\n mcuList.filter(\n (mcu) =>\n mcu.providers.includes(provider) &&\n !EXCLUDED_FROM_BOOTLOADER_VERSIONS.has(mcu.fromBootloaderVersion) &&\n isSameBootloaderVersion(mcu.fromBootloaderVersion, bootloaderVersion),\n ),\n );\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,EAAA,gCAAAC,EAAA,4BAAAC,IAAA,eAAAC,EAAAL,GAAA,IAAAM,EAAgC,kBAOhC,MAAMC,EAA+B,EAK/BC,EAAoC,IAAI,IAAI,CAChD,OACA,SACA,OACA,EACF,CAAC,EAOYJ,EAA0B,CACrCK,EACAC,IACY,CACZ,MAAMC,KAAU,UAAOF,CAAiB,GAAG,QACrCG,KAAe,UAAOF,CAAsB,GAAG,QAErD,OAAOC,IAAY,QAAaC,IAAiB,OAC7CD,IAAYC,EACZH,IAAsBC,CAC5B,EAEMG,EAAcC,GAClBA,EAAQ,OACN,CAACC,EAAWC,IAAQ,CAClB,MAAMC,KAAU,UAAOD,EAAI,IAAI,GAAG,QAElC,OAAKC,IAID,CAACF,MAAa,WAAQE,EAASF,EAAU,OAAO,EAAI,GAC/C,CACL,GAAGC,EACH,QAAAC,CACF,EAPOF,CAWX,EACA,IACF,EAEWb,EAAoB,CAC/BY,EACAI,EACAC,EAAmBZ,IAEnBM,EACEC,EAAQ,OACLE,GACCE,EAAc,YAAY,SAASF,EAAI,EAAE,GACzCA,EAAI,UAAU,SAASG,CAAQ,GAC/B,CAACX,EAAkC,IAAIQ,EAAI,qBAAqB,CACpE,CACF,EAMWb,EAA8B,CACzCW,EACAL,EACAU,EAAmBZ,IAEnBM,EACEC,EAAQ,OACLE,GACCA,EAAI,UAAU,SAASG,CAAQ,GAC/B,CAACX,EAAkC,IAAIQ,EAAI,qBAAqB,GAChEZ,EAAwBY,EAAI,sBAAuBP,CAAiB,CACxE,CACF",
|
|
6
|
+
"names": ["OsUpdateUtils_exports", "__export", "bestCompatibleMcu", "bestMcuForBootloaderVersion", "isSameBootloaderVersion", "__toCommonJS", "import_semver", "DEFAULT_MANAGER_API_PROVIDER", "EXCLUDED_FROM_BOOTLOADER_VERSIONS", "bootloaderVersion", "otherBootloaderVersion", "coerced", "otherCoerced", "highestMcu", "mcuList", "latestMcu", "mcu", "version", "finalFirmware", "provider"]
|
|
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"),
|
|
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} 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 },\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,
|
|
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 c=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var
|
|
1
|
+
"use strict";var c=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var D=(o,r)=>{for(var e in r)c(o,e,{get:r[e],enumerable:!0})},f=(o,r,e,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of m(r))!S.call(o,i)&&i!==e&&c(o,i,{get:()=>r[i],enumerable:!(a=M(r,i))||a.enumerable});return o};var I=o=>f(c({},"__esModule",{value:!0}),o);var E={};D(E,{FlashMcuDeviceAction:()=>A});module.exports=I(E);var n=require("@ledgerhq/device-management-kit"),l=require("purify-ts"),t=require("xstate"),d=require("../../../../device-action/OsUpdate/Shared/Substeps/GetOsVersion"),p=require("./Substeps/FlashMcu"),h=require("./Substeps/ResolveMcuVersion"),v=require("./FlashMcuDeviceActionErrors"),s=require("./types");const u=10,g=2e3;class A extends n.XStateDeviceAction{makeStateMachine(r){return(0,t.setup)({types:{input:{},output:{},context:{}},actors:{getDeviceInfo:(0,t.fromPromise)((0,d.getOsVersion)(r)),resolveMcuVersion:(0,t.fromPromise)((0,h.resolveMcuVersion)(r)),flashMcu:(0,t.fromObservable)((0,p.flashMcu)(r))},delays:{bootloaderPollInterval:g},guards:{isDeviceInBootloaderMode:({context:e})=>e._internalState.deviceInfo?.isBootloader===!0,hasReachedMaxAttempts:({context:e})=>e._internalState.bootloaderPollAttempts>=u,hasError:({context:e})=>e._internalState.error!==null},actions:{assignErrorFromEvent:(0,t.assign)({_internalState:e=>({...e.context._internalState,error:e.event.error})})}}).createMachine({id:"FlashMcuDeviceAction",initial:"GetDeviceInfo",context:({input:e})=>({input:e,intermediateValue:{requiredUserInteraction:n.UserInteractionRequired.None,step:s.FlashMcuSteps.Idle},_internalState:{error:null,deviceInfo:null,version:null,bootloaderPollAttempts:0}}),states:{GetDeviceInfo:{entry:(0,t.assign)({intermediateValue:e=>({...e.context.intermediateValue,step:s.FlashMcuSteps.GetDeviceInfo}),_internalState:e=>({...e.context._internalState,bootloaderPollAttempts:e.context._internalState.bootloaderPollAttempts+1})}),invoke:{src:"getDeviceInfo",onDone:{actions:(0,t.assign)({_internalState:e=>e.event.output.caseOf({Left:a=>({...e.context._internalState,error:a}),Right:a=>({...e.context._internalState,deviceInfo:a})})}),target:"CheckGetDeviceInfo"},onError:{actions:"assignErrorFromEvent",target:"Error"}}},CheckGetDeviceInfo:{always:[{guard:"hasError",target:"Error"},{guard:"isDeviceInBootloaderMode",target:"ResolveMcuVersion"},{guard:"hasReachedMaxAttempts",actions:(0,t.assign)({_internalState:e=>({...e.context._internalState,error:new v.BootloaderModeTimeoutError(`Device did not enter bootloader mode after ${u} attempts`)})}),target:"Error"},{target:"WaitForBootloaderMode"}]},WaitForBootloaderMode:{after:{bootloaderPollInterval:{target:"GetDeviceInfo"}}},ResolveMcuVersion:{entry:(0,t.assign)({intermediateValue:e=>({...e.context.intermediateValue,step:s.FlashMcuSteps.ResolveMcuVersion})}),invoke:{src:"resolveMcuVersion",input:({context:e})=>({...e.input,deviceInfo:e._internalState.deviceInfo}),onDone:{actions:(0,t.assign)({_internalState:e=>e.event.output.caseOf({Left:a=>({...e.context._internalState,error:a}),Right:a=>({...e.context._internalState,version:a})})}),target:"CheckResolveMcuVersion"},onError:{actions:"assignErrorFromEvent",target:"Error"}}},CheckResolveMcuVersion:{always:[{guard:"hasError",target:"Error"},{target:"FlashMcuOrBootloader"}]},FlashMcuOrBootloader:{entry:(0,t.assign)({intermediateValue:e=>({...e.context.intermediateValue,step:s.FlashMcuSteps.FlashMcuOrBootloader})}),invoke:{src:"flashMcu",input:({context:e})=>({deviceInfo:e._internalState.deviceInfo,version:e._internalState.version}),onSnapshot:{actions:(0,t.assign)({intermediateValue:e=>e.event.snapshot.context?.type===n.SecureChannelEventType.Progress?{...e.context.intermediateValue,progress:e.event.snapshot.context.payload.progress}:{...e.context.intermediateValue},_internalState:e=>e.event.snapshot.context?.type===n.SecureChannelEventType.Error?{...e.context._internalState,error:e.event.snapshot.context.error.mapFlashMcuDAErrors()}:e.context._internalState})},onDone:{target:"CheckFlashMcu"},onError:{actions:"assignErrorFromEvent",target:"Error"}}},CheckFlashMcu:{always:[{guard:"hasError",target:"Error"},{target:"Success"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:e})=>e._internalState.error!==null?(0,l.Left)(e._internalState.error):(0,l.Right)(void 0)})}}0&&(module.exports={FlashMcuDeviceAction});
|
|
2
2
|
//# sourceMappingURL=FlashMcuDeviceAction.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/api/device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type DeviceActionStateMachine,\n type InternalApi,\n SecureChannelEventType,\n type StateMachineTypes,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { assign, fromObservable, fromPromise, setup } from \"xstate\";\n\nimport { getOsVersion } from \"@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion\";\n\nimport { flashMcu } from \"./Substeps/FlashMcu\";\nimport { resolveMcuVersion } from \"./Substeps/ResolveMcuVersion\";\nimport { BootloaderModeTimeoutError } from \"./FlashMcuDeviceActionErrors\";\nimport {\n type FlashMcuDAError,\n type FlashMcuDAInput,\n type FlashMcuDAIntermediateValue,\n type FlashMcuDAInternalState,\n FlashMcuSteps,\n} from \"./types\";\n\n/*\n * The device reboots into the bootloader on its own, so it can still answer as\n * the running OS for a short while. Poll a bounded number of times rather than\n * assuming it presents as a bootloader straight away.\n */\nconst MAX_BOOTLOADER_POLL_ATTEMPTS = 10;\nconst BOOTLOADER_POLL_INTERVAL_MS = 2000;\n\nexport class FlashMcuDeviceAction extends XStateDeviceAction<\n void,\n FlashMcuDAInput,\n FlashMcuDAError,\n FlashMcuDAIntermediateValue,\n FlashMcuDAInternalState\n> {\n protected override makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n void,\n FlashMcuDAInput,\n FlashMcuDAError,\n FlashMcuDAIntermediateValue,\n FlashMcuDAInternalState\n > {\n type types = StateMachineTypes<\n void,\n FlashMcuDAInput,\n FlashMcuDAError,\n FlashMcuDAIntermediateValue,\n FlashMcuDAInternalState\n >;\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n output: {} as types[\"output\"],\n context: {} as types[\"context\"],\n } as types,\n actors: {\n getDeviceInfo: fromPromise(getOsVersion(internalApi)),\n resolveMcuVersion: fromPromise(resolveMcuVersion(internalApi)),\n flashMcu: fromObservable(flashMcu(internalApi)),\n },\n delays: {\n bootloaderPollInterval: BOOTLOADER_POLL_INTERVAL_MS,\n },\n guards: {\n isDeviceInBootloaderMode: ({ context }) =>\n context._internalState.deviceInfo?.isBootloader === true,\n hasReachedMaxAttempts: ({ context }) =>\n context._internalState.bootloaderPollAttempts >=\n MAX_BOOTLOADER_POLL_ATTEMPTS,\n hasError: ({ context }) => context._internalState.error !== null,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: _.event[\"error\"], // NOTE: should never happen\n }),\n }),\n },\n }).createMachine({\n id: \"FlashMcuDeviceAction\",\n initial: \"GetDeviceInfo\",\n context: ({ input }) => ({\n input
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAOO,2CACPC,EAA4B,qBAC5BC,EAA2D,kBAE3DC,EAA6B,oEAE7BC,EAAyB,+BACzBC,EAAkC,wCAClCC,EAA2C,wCAC3CC,EAMO,mBAOP,MAAMC,EAA+B,GAC/BC,EAA8B,IAE7B,MAAMX,UAA6B,oBAMxC,CACmB,iBACjBY,EAOA,CASA,SAAO,SAAM,CACX,MAAO,CACL,MAAO,CAAC,EACR,OAAQ,CAAC,EACT,QAAS,CAAC,CACZ,EACA,OAAQ,CACN,iBAAe,kBAAY,gBAAaA,CAAW,CAAC,EACpD,qBAAmB,kBAAY,qBAAkBA,CAAW,CAAC,EAC7D,YAAU,qBAAe,YAASA,CAAW,CAAC,CAChD,EACA,OAAQ,CACN,uBAAwBD,CAC1B,EACA,OAAQ,CACN,yBAA0B,CAAC,CAAE,QAAAE,CAAQ,IACnCA,EAAQ,eAAe,YAAY,eAAiB,GACtD,sBAAuB,CAAC,CAAE,QAAAA,CAAQ,IAChCA,EAAQ,eAAe,wBACvBH,EACF,SAAU,CAAC,CAAE,QAAAG,CAAQ,IAAMA,EAAQ,eAAe,QAAU,IAC9D,EACA,QAAS,CACP,wBAAsB,UAAO,CAC3B,eAAiBC,IAAO,CACtB,GAAGA,EAAE,QAAQ,eACb,MAAOA,EAAE,MAAM,KACjB,EACF,CAAC,CACH,CACF,CAAC,EAAE,cAAc,CACf,GAAI,uBACJ,QAAS,gBACT,QAAS,CAAC,CAAE,MAAAC,CAAM,KAAO,CACvB,
|
|
4
|
+
"sourcesContent": ["import {\n type DeviceActionStateMachine,\n type InternalApi,\n SecureChannelEventType,\n type StateMachineTypes,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { assign, fromObservable, fromPromise, setup } from \"xstate\";\n\nimport { getOsVersion } from \"@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion\";\n\nimport { flashMcu } from \"./Substeps/FlashMcu\";\nimport { resolveMcuVersion } from \"./Substeps/ResolveMcuVersion\";\nimport { BootloaderModeTimeoutError } from \"./FlashMcuDeviceActionErrors\";\nimport {\n type FlashMcuDAError,\n type FlashMcuDAInput,\n type FlashMcuDAIntermediateValue,\n type FlashMcuDAInternalState,\n FlashMcuSteps,\n} from \"./types\";\n\n/*\n * The device reboots into the bootloader on its own, so it can still answer as\n * the running OS for a short while. Poll a bounded number of times rather than\n * assuming it presents as a bootloader straight away.\n */\nconst MAX_BOOTLOADER_POLL_ATTEMPTS = 10;\nconst BOOTLOADER_POLL_INTERVAL_MS = 2000;\n\nexport class FlashMcuDeviceAction extends XStateDeviceAction<\n void,\n FlashMcuDAInput,\n FlashMcuDAError,\n FlashMcuDAIntermediateValue,\n FlashMcuDAInternalState\n> {\n protected override makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n void,\n FlashMcuDAInput,\n FlashMcuDAError,\n FlashMcuDAIntermediateValue,\n FlashMcuDAInternalState\n > {\n type types = StateMachineTypes<\n void,\n FlashMcuDAInput,\n FlashMcuDAError,\n FlashMcuDAIntermediateValue,\n FlashMcuDAInternalState\n >;\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n output: {} as types[\"output\"],\n context: {} as types[\"context\"],\n } as types,\n actors: {\n getDeviceInfo: fromPromise(getOsVersion(internalApi)),\n resolveMcuVersion: fromPromise(resolveMcuVersion(internalApi)),\n flashMcu: fromObservable(flashMcu(internalApi)),\n },\n delays: {\n bootloaderPollInterval: BOOTLOADER_POLL_INTERVAL_MS,\n },\n guards: {\n isDeviceInBootloaderMode: ({ context }) =>\n context._internalState.deviceInfo?.isBootloader === true,\n hasReachedMaxAttempts: ({ context }) =>\n context._internalState.bootloaderPollAttempts >=\n MAX_BOOTLOADER_POLL_ATTEMPTS,\n hasError: ({ context }) => context._internalState.error !== null,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: _.event[\"error\"], // NOTE: should never happen\n }),\n }),\n },\n }).createMachine({\n id: \"FlashMcuDeviceAction\",\n initial: \"GetDeviceInfo\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: FlashMcuSteps.Idle,\n },\n _internalState: {\n error: null,\n deviceInfo: null,\n version: null,\n bootloaderPollAttempts: 0,\n },\n }),\n states: {\n GetDeviceInfo: {\n entry: assign({\n intermediateValue: (_) => ({\n ..._.context.intermediateValue,\n step: FlashMcuSteps.GetDeviceInfo,\n }),\n _internalState: (_) => ({\n ..._.context._internalState,\n bootloaderPollAttempts:\n _.context._internalState.bootloaderPollAttempts + 1,\n }),\n }),\n invoke: {\n src: \"getDeviceInfo\",\n onDone: {\n actions: assign({\n _internalState: (_) =>\n _.event.output.caseOf<FlashMcuDAInternalState>({\n Left: (error) => ({\n ..._.context._internalState,\n error,\n }),\n Right: (getOsVersionResponse) => ({\n ..._.context._internalState,\n deviceInfo: getOsVersionResponse,\n }),\n }),\n }),\n target: \"CheckGetDeviceInfo\",\n },\n onError: {\n actions: \"assignErrorFromEvent\",\n target: \"Error\",\n },\n },\n },\n CheckGetDeviceInfo: {\n always: [\n {\n guard: \"hasError\",\n target: \"Error\",\n },\n {\n guard: \"isDeviceInBootloaderMode\",\n target: \"ResolveMcuVersion\",\n },\n {\n guard: \"hasReachedMaxAttempts\",\n actions: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new BootloaderModeTimeoutError(\n `Device did not enter bootloader mode after ${MAX_BOOTLOADER_POLL_ATTEMPTS} attempts`,\n ),\n }),\n }),\n target: \"Error\",\n },\n {\n target: \"WaitForBootloaderMode\",\n },\n ],\n },\n WaitForBootloaderMode: {\n after: {\n bootloaderPollInterval: {\n target: \"GetDeviceInfo\",\n },\n },\n },\n ResolveMcuVersion: {\n entry: assign({\n intermediateValue: (_) => ({\n ..._.context.intermediateValue,\n step: FlashMcuSteps.ResolveMcuVersion,\n }),\n }),\n invoke: {\n src: \"resolveMcuVersion\",\n input: ({ context }) => ({\n ...context.input,\n deviceInfo: context._internalState.deviceInfo!,\n }),\n onDone: {\n actions: assign({\n _internalState: (_) =>\n _.event.output.caseOf<FlashMcuDAInternalState>({\n Left: (error) => ({\n ..._.context._internalState,\n error,\n }),\n Right: (version) => ({\n ..._.context._internalState,\n version,\n }),\n }),\n }),\n target: \"CheckResolveMcuVersion\",\n },\n onError: {\n actions: \"assignErrorFromEvent\",\n target: \"Error\",\n },\n },\n },\n CheckResolveMcuVersion: {\n always: [\n {\n guard: \"hasError\",\n target: \"Error\",\n },\n {\n target: \"FlashMcuOrBootloader\",\n },\n ],\n },\n FlashMcuOrBootloader: {\n entry: assign({\n intermediateValue: (_) => ({\n ..._.context.intermediateValue,\n step: FlashMcuSteps.FlashMcuOrBootloader,\n }),\n }),\n invoke: {\n src: \"flashMcu\",\n input: ({ context }) => ({\n deviceInfo: context._internalState.deviceInfo!,\n version: context._internalState.version!,\n }),\n onSnapshot: {\n actions: assign({\n // Flashing the MCU needs no device confirmation, so the bulk\n // exchange only reports progress here.\n intermediateValue: (_) =>\n _.event.snapshot.context?.type ===\n SecureChannelEventType.Progress\n ? {\n ..._.context.intermediateValue,\n progress: _.event.snapshot.context.payload.progress,\n }\n : { ..._.context.intermediateValue },\n _internalState: (_) => {\n if (\n _.event.snapshot.context?.type ===\n SecureChannelEventType.Error\n ) {\n return {\n ..._.context._internalState,\n error:\n _.event.snapshot.context.error.mapFlashMcuDAErrors(),\n };\n }\n return _.context._internalState;\n },\n }),\n },\n onDone: {\n target: \"CheckFlashMcu\",\n },\n onError: {\n actions: \"assignErrorFromEvent\",\n target: \"Error\",\n },\n },\n },\n CheckFlashMcu: {\n always: [\n {\n guard: \"hasError\",\n target: \"Error\",\n },\n {\n target: \"Success\",\n },\n ],\n },\n Success: {\n type: \"final\",\n },\n Error: {\n type: \"final\",\n },\n },\n output: ({ context }) =>\n context._internalState.error !== null\n ? Left(context._internalState.error)\n : Right(undefined),\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["FlashMcuDeviceAction_exports", "__export", "FlashMcuDeviceAction", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_xstate", "import_GetOsVersion", "import_FlashMcu", "import_ResolveMcuVersion", "import_FlashMcuDeviceActionErrors", "import_types", "MAX_BOOTLOADER_POLL_ATTEMPTS", "BOOTLOADER_POLL_INTERVAL_MS", "internalApi", "context", "_", "input", "error", "getOsVersionResponse", "version"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var s=require("@ledgerhq/device-management-kit"),c=require("purify-ts"),v=require("rxjs"),l=require("../../../../device-action/__test-utils__/makeInternalApi"),u=require("../../../../device-action/__test-utils__/testDeviceActionStates"),V=require("../../../../device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors"),y=require("../../../../device-action/OsUpdate/Shared/Substeps/GetOsVersion"),E=require("../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction"),w=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:s.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:s.UserInteractionRequired.None,step:a,...S}}),F=()=>({status:s.DeviceActionStatus.Completed,output:void 0}),M=a=>({status:s.DeviceActionStatus.Error,error:a}),D=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:s.SeedWordCount.TwentyFour,currentWordIndex:0,onboardingState:s.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=(t=(0,c.Right)(a))=>vi.mocked(y.getOsVersion).mockReturnValue(()=>Promise.resolve(t)),A=t=>{const r=[...t];vi.mocked(y.getOsVersion).mockReturnValue(()=>Promise.resolve(r.shift()??(0,c.Right)(a)))},p=(t=(0,c.Right)("1.12"))=>{const r=vi.fn().mockResolvedValue(t);return vi.mocked(O.resolveMcuVersion).mockReturnValue(r),r},m=(t=(0,v.of)())=>{const r=vi.fn().mockReturnValue(t);return vi.mocked(g.flashMcu).mockReturnValue(r),r},d=(t={mode:"osUpdate",finalFirmware:S})=>new E.FlashMcuDeviceAction({input:t});describe("Success",()=>{it("Should flash the MCU when the device is already in bootloader mode",()=>new Promise((t,r)=>{h();const n=p(),i=m(),f=[o(e.FlashMcuSteps.GetDeviceInfo),o(e.FlashMcuSteps.ResolveMcuVersion),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader),F()];(0,u.testDeviceActionStates)(d(),f,(0,l.makeDeviceActionInternalApiMock)(),{onDone:()=>{expect(n).toHaveBeenCalledWith(expect.objectContaining({input:{mode:"osUpdate",deviceInfo:a,finalFirmware:S}})),expect(i).toHaveBeenCalledWith(expect.objectContaining({input:{deviceInfo:a,version:"1.12"}})),t()},onError:r})})),it("Should flash the MCU in bootloader recovery mode without a final firmware",()=>new Promise((t,r)=>{h();const n=p(),i=m(),f=[o(e.FlashMcuSteps.GetDeviceInfo),o(e.FlashMcuSteps.ResolveMcuVersion),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader),F()];(0,u.testDeviceActionStates)(d({mode:"bootloaderRecovery"}),f,(0,l.makeDeviceActionInternalApiMock)(),{onDone:()=>{expect(n).toHaveBeenCalledWith(expect.objectContaining({input:{mode:"bootloaderRecovery",deviceInfo:a}})),expect(i).toHaveBeenCalledWith(expect.objectContaining({input:{deviceInfo:a,version:"1.12"}})),t()},onError:r})})),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(),m();const t=[...D(3),o(e.FlashMcuSteps.ResolveMcuVersion),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader),F()],r=new Promise((n,i)=>{(0,u.testDeviceActionStates)(d(),t,(0,l.makeDeviceActionInternalApiMock)(),{onDone:n,onError:i})});await vi.advanceTimersByTimeAsync(2e3*3),await r,vi.useRealTimers()}),it("Should report the flash progress",()=>new Promise((t,r)=>{h(),p(),m((0,v.of)({type:s.SecureChannelEventType.Progress,payload:{progress:.5,index:0,total:2}},{type:s.SecureChannelEventType.Progress,payload:{progress:1,index:1,total:2}}));const n=[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}),F()];(0,u.testDeviceActionStates)(d(),n,(0,l.makeDeviceActionInternalApiMock)(),{onDone:t,onError:r})}))}),describe("Error",()=>{it("Should go to Error when getOsVersion returns Left",()=>new Promise((t,r)=>{const n=new V.GetOsVersionError(new Error("command failed"));h((0,c.Left)(n));const i=[o(e.FlashMcuSteps.GetDeviceInfo),M(n)];(0,u.testDeviceActionStates)(d(),i,(0,l.makeDeviceActionInternalApiMock)(),{onDone:t,onError:r})})),it("Should go to Error when the device never enters bootloader mode",async()=>{vi.useFakeTimers(),h((0,c.Right)({...a,isBootloader:!1}));const t=[...D(10),M(new w.BootloaderModeTimeoutError("Device did not enter bootloader mode after 10 attempts"))],r=new Promise((n,i)=>{(0,u.testDeviceActionStates)(d(),t,(0,l.makeDeviceActionInternalApiMock)(),{onDone:n,onError:i})});await vi.advanceTimersByTimeAsync(2e3*11),await r,vi.useRealTimers()}),it("Should go to Error when resolveMcuVersion returns Left",()=>new Promise((t,r)=>{h();const n=new w.ResolveMcuVersionError("no compatible MCU");p((0,c.Left)(n));const i=[o(e.FlashMcuSteps.GetDeviceInfo),o(e.FlashMcuSteps.ResolveMcuVersion),M(n)];(0,u.testDeviceActionStates)(d(),i,(0,l.makeDeviceActionInternalApiMock)(),{onDone:t,onError:r})})),it("Should map a secure channel error event to a device action error",()=>new Promise((t,r)=>{h(),p(),m((0,v.of)({type:s.SecureChannelEventType.Error,error:new s.SecureChannelError("flash failed")}));const n=[o(e.FlashMcuSteps.GetDeviceInfo),o(e.FlashMcuSteps.ResolveMcuVersion),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader),M(new s.UnknownDAError)];(0,u.testDeviceActionStates)(d(),n,(0,l.makeDeviceActionInternalApiMock)(),{onDone:t,onError:r})})),it("Should go to Error when the secure channel connection cannot be opened",()=>new Promise((t,r)=>{h(),p();const n=new s.UnknownDAError("Invalid WebSocket connection");m(new v.Observable(f=>{f.error(n)}));const i=[o(e.FlashMcuSteps.GetDeviceInfo),o(e.FlashMcuSteps.ResolveMcuVersion),o(e.FlashMcuSteps.FlashMcuOrBootloader),o(e.FlashMcuSteps.FlashMcuOrBootloader),M(n)];(0,u.testDeviceActionStates)(d(),i,(0,l.makeDeviceActionInternalApiMock)(),{onDone:t,onError:r})}))})});
|
|
2
2
|
//# sourceMappingURL=FlashMcuDeviceAction.test.js.map
|