@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,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../../src/api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type GetOsVersionResponse,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { Right } from \"purify-ts\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { installFirmware } from \"@api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware\";\n\ndescribe(\"InstallFirmware\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n const { getSecureChannelService: getSecureChannelServiceMock } = apiMock;\n\n const deviceInfo = {\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 updateFirmwareMock = vi.fn();\n\n beforeEach(() => {\n vi.resetAllMocks();\n updateFirmwareMock.mockReturnValue(Right({}));\n getSecureChannelServiceMock.mockReturnValue({\n updateFirmware: updateFirmwareMock,\n } as unknown as ReturnType<InternalApi[\"getSecureChannelService\"]>);\n });\n\n it(\"Should open a secure channel with the OSU firmware payload\", () => {\n const firmware = {\n perso: \"perso\",\n firmware: \"osu\",\n firmwareKey: \"osu-key\",\n };\n\n installFirmware(apiMock)({ input: { deviceInfo, firmware } });\n\n expect(updateFirmwareMock).toHaveBeenCalledWith(deviceInfo, firmware);\n });\n});\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["import_purify_ts", "import_makeInternalApi", "import_InstallFirmware", "apiMock", "getSecureChannelServiceMock", "deviceInfo", "updateFirmwareMock", "firmware"]
|
|
4
|
+
"sourcesContent": ["import {\n type GetOsVersionResponse,\n type InternalApi,\n OnboardingState,\n SeedWordCount,\n} from \"@ledgerhq/device-management-kit\";\nimport { Right } from \"purify-ts\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { installFirmware } from \"@api/device-action/OsUpdate/Update/InstallOsUpdate/Substeps/InstallFirmware\";\n\ndescribe(\"InstallFirmware\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n const { getSecureChannelService: getSecureChannelServiceMock } = apiMock;\n\n const deviceInfo = {\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 updateFirmwareMock = vi.fn();\n\n beforeEach(() => {\n vi.resetAllMocks();\n updateFirmwareMock.mockReturnValue(Right({}));\n getSecureChannelServiceMock.mockReturnValue({\n updateFirmware: updateFirmwareMock,\n } as unknown as ReturnType<InternalApi[\"getSecureChannelService\"]>);\n });\n\n it(\"Should open a secure channel with the OSU firmware payload\", () => {\n const firmware = {\n perso: \"perso\",\n firmware: \"osu\",\n firmwareKey: \"osu-key\",\n };\n\n installFirmware(apiMock)({ input: { deviceInfo, firmware } });\n\n expect(updateFirmwareMock).toHaveBeenCalledWith(deviceInfo, firmware);\n });\n});\n"],
|
|
5
|
+
"mappings": "aAAA,IAAAA,EAKO,2CACPC,EAAsB,qBAEtBC,EAAgD,6DAChDC,EAAgC,uFAEhC,SAAS,kBAAmB,IAAM,CAChC,MAAMC,KAAU,mCAAgC,EAC1C,CAAE,wBAAyBC,CAA4B,EAAID,EAE3DE,EAAa,CACjB,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,EAEMC,EAAqB,GAAG,GAAG,EAEjC,WAAW,IAAM,CACf,GAAG,cAAc,EACjBA,EAAmB,mBAAgB,SAAM,CAAC,CAAC,CAAC,EAC5CF,EAA4B,gBAAgB,CAC1C,eAAgBE,CAClB,CAAkE,CACpE,CAAC,EAED,GAAG,6DAA8D,IAAM,CACrE,MAAMC,EAAW,CACf,MAAO,QACP,SAAU,MACV,YAAa,SACf,KAEA,mBAAgBJ,CAAO,EAAE,CAAE,MAAO,CAAE,WAAAE,EAAY,SAAAE,CAAS,CAAE,CAAC,EAE5D,OAAOD,CAAkB,EAAE,qBAAqBD,EAAYE,CAAQ,CACtE,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_device_management_kit", "import_purify_ts", "import_makeInternalApi", "import_InstallFirmware", "apiMock", "getSecureChannelServiceMock", "deviceInfo", "updateFirmwareMock", "firmware"]
|
|
7
7
|
}
|
package/lib/cjs/package.json
CHANGED
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"license": "Apache-2.0",
|
|
37
37
|
"name": "@ledgerhq/dmk-ledger-wallet",
|
|
38
38
|
"peerDependencies": {
|
|
39
|
-
"@ledgerhq/device-management-kit": "
|
|
39
|
+
"@ledgerhq/device-management-kit": "workspace:^"
|
|
40
40
|
},
|
|
41
41
|
"private": false,
|
|
42
42
|
"repository": {
|
|
@@ -59,5 +59,5 @@
|
|
|
59
59
|
"watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
60
60
|
"watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
|
|
61
61
|
},
|
|
62
|
-
"version": "0.
|
|
62
|
+
"version": "0.6.0"
|
|
63
63
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{DeviceActionStatus as
|
|
1
|
+
import{DeviceActionStatus as w,OnboardingState as P,SeedWordCount as y,UnknownDAError as S,UserInteractionRequired as U}from"@ledgerhq/device-management-kit";import{Left as h,Right as c}from"purify-ts";import{assign as F,createMachine as g}from"xstate";import{makeDeviceActionInternalApiMock as d}from"../../../device-action/__test-utils__/makeInternalApi";import{testDeviceActionStates as p}from"../../../device-action/__test-utils__/testDeviceActionStates";import{ResolveOsUpdatePathDeviceAction as E}from"../../../device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceAction";import{ResolveOsUpdatePathError as b}from"../../../device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceActionErrors";import{resolveOsUpdatePath as T}from"../../../device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath";import{ResolveOsUpdatePathSteps as e}from"../../../device-action/OsUpdate/Resolve/types";import{GetOsVersionError as W}from"../../../device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors";import{getOsVersion as G}from"../../../device-action/OsUpdate/Shared/Substeps/GetOsVersion";import{goToDashboard as x}from"../../../device-action/OsUpdate/Shared/Substeps/GoToDashboard";import{waitForAppAndVersion as f}from"../../../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=n=>({status:w.Pending,intermediateValue:{requiredUserInteraction:U.None,step:n}}),R=n=>({status:w.Completed,output:n}),A=n=>({status:w.Error,error:n}),k=n=>g({initial:"ready",states:{ready:{after:{0:"done"},entry:F({intermediateValue:()=>({requiredUserInteraction:U.None})})},done:{type:"final"}},output:n}),O=n=>k(()=>n);describe("ResolveOsUpdatePathDeviceAction",()=>{const n={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:y.TwentyFour,currentWordIndex:0,onboardingState:P.Unknown}},v=[{osuFirmware:{id:200,notes:"Update notes",perso:"perso",firmware:"osu",firmwareKey:"osu-key",hash:"osu-hash",nextFinalFirmware:300},finalFirmware:{id:300,version:"1.4.0",perso:"perso",firmware:"final",firmwareKey:"final-key",hash:"final-hash",bytes:123,mcuVersions:[1]},shouldFlashMcu:!1}];beforeEach(()=>{vi.resetAllMocks()});const u=(t="BOLOS")=>vi.mocked(f).mockReturnValue(O(c({name:t,version:"1.0.0"}))),D=t=>{const s=[...t];vi.mocked(f).mockReturnValue(k(()=>c({name:s.shift()??"BOLOS",version:"1.0.0"})))},V=(t=c(void 0))=>vi.mocked(x).mockReturnValue(O(t)),l=(t=c(n))=>vi.mocked(G).mockReturnValue(()=>Promise.resolve(t)),m=(t=c(v))=>vi.mocked(T).mockReturnValue(()=>Promise.resolve(t)),i=()=>new E({input:{unlockTimeout:3e4}});describe("Success",()=>{it("Should complete the resolve flow when the device is already on dashboard",()=>new Promise((t,s)=>{u(),l(),m();const r=[o(e.WaitForAppAndVersion),o(e.WaitForAppAndVersion),o(e.GetOsVersion),o(e.ResolveOsUpdatePath),R(v)];p(i(),r,d(),{onDone:t,onError:s})})),it("Should go to dashboard and wait for app and version again when an app is open",()=>new Promise((t,s)=>{D(["Bitcoin","BOLOS"]),V(),l(),m();const r=[o(e.WaitForAppAndVersion),o(e.WaitForAppAndVersion),o(e.GoToDashboard),o(e.GoToDashboard),o(e.WaitForAppAndVersion),o(e.WaitForAppAndVersion),o(e.GetOsVersion),o(e.ResolveOsUpdatePath),R(v)];p(i(),r,d(),{onDone:t,onError:s})}))}),describe("Error",()=>{it("Should go to Error when waitForAppAndVersion returns Left",()=>new Promise((t,s)=>{const r=new S("waitForAppAndVersion failed");vi.mocked(f).mockReturnValue(O(h(r)));const a=[o(e.WaitForAppAndVersion),o(e.WaitForAppAndVersion),A(r)];p(i(),a,d(),{onDone:t,onError:s})})),it("Should go to Error when goToDashboard returns Left",()=>new Promise((t,s)=>{u("Bitcoin");const r=new S("goToDashboard failed");V(h(r));const a=[o(e.WaitForAppAndVersion),o(e.WaitForAppAndVersion),o(e.GoToDashboard),o(e.GoToDashboard),A(r)];p(i(),a,d(),{onDone:t,onError:s})})),it("Should go to Error when getOsVersion returns Left",()=>new Promise((t,s)=>{u();const r=new W(new Error("command failed"));l(h(r)),m();const a=[o(e.WaitForAppAndVersion),o(e.WaitForAppAndVersion),o(e.GetOsVersion),A(r)];p(i(),a,d(),{onDone:t,onError:s})})),it("Should go to Error when resolveOsUpdatePath returns Left",()=>new Promise((t,s)=>{u(),l();const r=new b(new Error("manager api failed"));m(h(r));const a=[o(e.WaitForAppAndVersion),o(e.WaitForAppAndVersion),o(e.GetOsVersion),o(e.ResolveOsUpdatePath),A(r)];p(i(),a,d(),{onDone:t,onError:s})}))})});
|
|
2
2
|
//# sourceMappingURL=ResolveOsUpdatePathDeviceAction.test.js.map
|
package/lib/esm/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,OACE,sBAAAA,EAEA,kBAAAC,EACA,2BAAAC,MACK,kCACP,OAAsB,QAAAC,EAAM,SAAAC,MAAa,YACzC,OAAS,UAAAC,EAAQ,iBAAAC,MAAqB,SAEtC,OAAS,mCAAAC,MAAuC,oDAChD,OAAS,0BAAAC,MAA8B,2DACvC,OAAS,mCAAAC,MAAuC,sEAChD,OAAS,4BAAAC,MAAgC,4EACzC,OAAS,uBAAAC,MAA2B,mEACpC,OAGE,4BAAAC,MACK,4CACP,OAAS,qBAAAC,MAAyB,gEAClC,OAAS,gBAAAC,MAAoB,2DAC7B,OAAS,iBAAAC,MAAqB,4DAC9B,OAAS,wBAAAC,MAA4B,mEAGrC,GAAG,KAAK,kEAAkE,EAC1E,GAAG,KAAK,2DAA2D,EACnE,GAAG,KAAK,0DAA0D,EAClE,GAAG,KAAK,kEAAkE,EAE1E,MAAMC,EACJC,IACgC,CAChC,
|
|
6
|
-
"names": ["DeviceActionStatus", "UnknownDAError", "UserInteractionRequired", "Left", "Right", "assign", "createMachine", "makeDeviceActionInternalApiMock", "testDeviceActionStates", "ResolveOsUpdatePathDeviceAction", "ResolveOsUpdatePathError", "resolveOsUpdatePath", "ResolveOsUpdatePathSteps", "GetOsVersionError", "getOsVersion", "goToDashboard", "waitForAppAndVersion", "pendingState", "step", "completedState", "output", "errorState", "error", "createMockActorMachineFromOutput", "createMockActorMachine", "getOsVersionResponse", "osUpdates", "setupWaitForAppAndVersion", "appName", "setupWaitForAppAndVersionSequence", "appNames", "remainingAppNames", "setupGoToDashboard", "setupGetOsVersion", "result", "setupResolveOsUpdatePath", "makeDeviceAction", "resolve", "reject", "expectedStates"]
|
|
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
|
+
"names": ["DeviceActionStatus", "OnboardingState", "SeedWordCount", "UnknownDAError", "UserInteractionRequired", "Left", "Right", "assign", "createMachine", "makeDeviceActionInternalApiMock", "testDeviceActionStates", "ResolveOsUpdatePathDeviceAction", "ResolveOsUpdatePathError", "resolveOsUpdatePath", "ResolveOsUpdatePathSteps", "GetOsVersionError", "getOsVersion", "goToDashboard", "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
|
-
import{EitherAsync as h,Just as c,Nothing as d}from"purify-ts";import{makeDeviceActionInternalApiMock as
|
|
1
|
+
import{OnboardingState as O,SeedWordCount as R}from"@ledgerhq/device-management-kit";import{EitherAsync as h,Just as c,Nothing as d}from"purify-ts";import{makeDeviceActionInternalApiMock as x}from"../../../../device-action/__test-utils__/makeInternalApi";import{ResolveOsUpdatePathError as V}from"../../../../device-action/OsUpdate/Resolve/ResolveOsUpdatePathDeviceActionErrors";import{resolveOsUpdatePath as u}from"../../../../device-action/OsUpdate/Resolve/Substeps/ResolveOsUpdatePath";const r=f=>h(()=>Promise.resolve(f)),k=f=>h(({throwE:i})=>Promise.resolve(i(f)));describe("ResolveOsUpdatePath",()=>{const i=x(),n={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:R.TwentyFour,currentWordIndex:0,onboardingState:O.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]},o={id:200,notes:"Update notes",perso:"perso",firmware:"osu",firmwareKey:"osu-key",hash:"osu-hash",nextFinalFirmware:300},w={...o,id:201,nextFinalFirmware:301},a={id:300,version:"1.4.0",perso:"perso",firmware:"final",firmwareKey:"final-key",hash:"final-hash",bytes:123,mcuVersions:[1]},p={...a,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(),i.getManagerApiService.mockReturnValue(e),e.getMcuList.mockReturnValue(r(g)),e.getDeviceVersion.mockReturnValue(r(l)),e.getFirmwareVersion.mockReturnValue(r(F)),e.getLatestFirmwareVersion.mockReturnValue(r(c(o))),e.getOsuFirmwareVersion.mockReturnValue(r(o)),e.getNextFirmwareVersion.mockReturnValue(r(a)),e.getProvider.mockReturnValue(1)}),describe("Success",()=>{it("Should return an empty update path when no firmware update is available",async()=>{e.getLatestFirmwareVersion.mockReturnValueOnce(r(d));const t=await u(i)({input:{getOsVersionResponse:n}});expect(t.extract()).toEqual([]),expect(e.getDeviceVersion).toHaveBeenCalledWith(n),expect(e.getFirmwareVersion).toHaveBeenCalledWith(n,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(c(o))).mockReturnValueOnce(r(d));const t=await u(i)({input:{getOsVersionResponse:n}});expect(t.extract()).toEqual([{osuFirmware:o,finalFirmware:a,shouldFlashMcu:!1}])}),it("Should resolve OSU mode from the OSU firmware endpoint",async()=>{e.getLatestFirmwareVersion.mockReturnValueOnce(r(d));const t={...n,isOsu:!0},s=await u(i)({input:{getOsVersionResponse:t}});expect(s.extract()).toEqual([{osuFirmware:o,finalFirmware:a,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(c(o))).mockReturnValueOnce(r(c(w))).mockReturnValueOnce(r(d)),e.getNextFirmwareVersion.mockReturnValueOnce(r(a)).mockReturnValueOnce(r(p));const t=await u(i)({input:{getOsVersionResponse:n}});expect(t.extract()).toEqual([{osuFirmware:o,finalFirmware:a,shouldFlashMcu:!1},{osuFirmware:w,finalFirmware:p,shouldFlashMcu:!0}]),expect(e.getDeviceVersion).toHaveBeenCalledTimes(1),expect(e.getLatestFirmwareVersion).toHaveBeenNthCalledWith(2,a,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]}],s={...a,mcuVersions:[2,3]},m={...p,mcuVersions:[3]};e.getMcuList.mockReturnValueOnce(r(t)),e.getLatestFirmwareVersion.mockReturnValueOnce(r(c(o))).mockReturnValueOnce(r(c(w))).mockReturnValueOnce(r(d)),e.getNextFirmwareVersion.mockReturnValueOnce(r(s)).mockReturnValueOnce(r(m));const v=await u(i)({input:{getOsVersionResponse:{...n,mcuSephVersion:"1.0"}}});expect(v.extract()).toEqual([{osuFirmware:o,finalFirmware:s,shouldFlashMcu:!0},{osuFirmware:w,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(k(t));const s=await u(i)({input:{getOsVersionResponse:n}});expect(s.isLeft()).toBe(!0),s.mapLeft(m=>{expect(m).toBeInstanceOf(V),expect(m.originalError).toBe(t)})}),it("Should return ResolveOsUpdatePathError when the current MCU version is unknown",async()=>{const t=await u(i)({input:{getOsVersionResponse:{...n,mcuSephVersion:"9.9.9"}}});expect(t.isLeft()).toBe(!0),t.mapLeft(s=>{expect(s).toBeInstanceOf(V),expect(s.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({...a,mcuVersions:[42]}));const t=await u(i)({input:{getOsVersionResponse:n}});expect(t.isLeft()).toBe(!0),t.mapLeft(s=>{expect(s).toBeInstanceOf(V),expect(s.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": ["EitherAsync", "Just", "Nothing", "makeDeviceActionInternalApiMock", "ResolveOsUpdatePathError", "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": ["OnboardingState", "SeedWordCount", "EitherAsync", "Just", "Nothing", "makeDeviceActionInternalApiMock", "ResolveOsUpdatePathError", "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
|
-
import{coerce as
|
|
1
|
+
import{coerce as i,compare as u}from"semver";const s=1,t=new Set(["none","noneee","rien",""]),a=(o,e)=>{const n=i(o)?.version,r=i(e)?.version;return n!==void 0&&r!==void 0?n===r:o===e},c=o=>o.reduce((e,n)=>{const r=i(n.name)?.version;return r&&(!e||u(r,e.version)>0)?{...n,version:r}:e},null),m=(o,e,n=s)=>c(o.filter(r=>e.mcuVersions.includes(r.id)&&r.providers.includes(n)&&!t.has(r.fromBootloaderVersion))),d=(o,e,n=s)=>c(o.filter(r=>r.providers.includes(n)&&!t.has(r.fromBootloaderVersion)&&a(r.fromBootloaderVersion,e)));export{m as bestCompatibleMcu,d as bestMcuForBootloaderVersion,a as 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": "AAAA,OAAS,UAAAA,EAAQ,WAAAC,MAAe,SAOhC,MAAMC,EAA+B,EAK/BC,EAAoC,IAAI,IAAI,CAChD,OACA,SACA,OACA,EACF,CAAC,
|
|
6
|
-
"names": ["coerce", "compare", "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": "AAAA,OAAS,UAAAA,EAAQ,WAAAC,MAAe,SAOhC,MAAMC,EAA+B,EAK/BC,EAAoC,IAAI,IAAI,CAChD,OACA,SACA,OACA,EACF,CAAC,EAOYC,EAA0B,CACrCC,EACAC,IACY,CACZ,MAAMC,EAAUP,EAAOK,CAAiB,GAAG,QACrCG,EAAeR,EAAOM,CAAsB,GAAG,QAErD,OAAOC,IAAY,QAAaC,IAAiB,OAC7CD,IAAYC,EACZH,IAAsBC,CAC5B,EAEMG,EAAcC,GAClBA,EAAQ,OACN,CAACC,EAAWC,IAAQ,CAClB,MAAMC,EAAUb,EAAOY,EAAI,IAAI,GAAG,QAElC,OAAKC,IAID,CAACF,GAAaV,EAAQY,EAASF,EAAU,OAAO,EAAI,GAC/C,CACL,GAAGC,EACH,QAAAC,CACF,EAPOF,CAWX,EACA,IACF,EAEWG,EAAoB,CAC/BJ,EACAK,EACAC,EAAmBd,IAEnBO,EACEC,EAAQ,OACLE,GACCG,EAAc,YAAY,SAASH,EAAI,EAAE,GACzCA,EAAI,UAAU,SAASI,CAAQ,GAC/B,CAACb,EAAkC,IAAIS,EAAI,qBAAqB,CACpE,CACF,EAMWK,EAA8B,CACzCP,EACAL,EACAW,EAAmBd,IAEnBO,EACEC,EAAQ,OACLE,GACCA,EAAI,UAAU,SAASI,CAAQ,GAC/B,CAACb,EAAkC,IAAIS,EAAI,qBAAqB,GAChER,EAAwBQ,EAAI,sBAAuBP,CAAiB,CACxE,CACF",
|
|
6
|
+
"names": ["coerce", "compare", "DEFAULT_MANAGER_API_PROVIDER", "EXCLUDED_FROM_BOOTLOADER_VERSIONS", "isSameBootloaderVersion", "bootloaderVersion", "otherBootloaderVersion", "coerced", "otherCoerced", "highestMcu", "mcuList", "latestMcu", "mcu", "version", "bestCompatibleMcu", "finalFirmware", "provider", "bestMcuForBootloaderVersion"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{CommandResultFactory as
|
|
1
|
+
import{CommandResultFactory as s,GLOBAL_ERRORS as a,GlobalCommandError as c,OnboardingState as d,SeedWordCount as l}from"@ledgerhq/device-management-kit";import{makeDeviceActionInternalApiMock as u}from"../../../../device-action/__test-utils__/makeInternalApi";import{GetOsVersionError as m}from"../../../../device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors";import{getOsVersion as i}from"../../../../device-action/OsUpdate/Shared/Substeps/GetOsVersion";describe("GetOsVersion",()=>{const o=u(),{sendCommand:t}=o;beforeEach(()=>{vi.resetAllMocks()}),describe("Success",()=>{it("Should return the OS version response",async()=>{const e={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:l.TwentyFour,currentWordIndex:0,onboardingState:d.Unknown}};t.mockResolvedValueOnce(s({data:e}));const r=await i(o)();expect(r.isRight()).toBe(!0),expect(r.extract()).toEqual(e)})}),describe("Error",()=>{it("Should return GetOsVersionError",async()=>{const e=new c({errorCode:"6e00",...a["6e00"]});t.mockResolvedValueOnce(s({error:e}));const r=await i(o)();expect(r.isLeft()).toBe(!0),r.mapLeft(n=>{expect(n).toBeInstanceOf(m),expect(n.originalError).toBe(e.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,OACE,wBAAAA,EACA,iBAAAC,EACA,sBAAAC,MACK,kCAEP,OAAS,mCAAAC,MAAuC,oDAChD,OAAS,qBAAAC,MAAyB,gEAClC,OAAS,gBAAAC,MAAoB,2DAE7B,SAAS,eAAgB,IAAM,CAC7B,MAAMC,EAAUH,EAAgC,EAC1C,CAAE,YAAaI,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,
|
|
6
|
-
"names": ["CommandResultFactory", "GLOBAL_ERRORS", "GlobalCommandError", "makeDeviceActionInternalApiMock", "GetOsVersionError", "getOsVersion", "apiMock", "sendCommandMock", "osVersion", "result", "error", "e"]
|
|
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,OACE,wBAAAA,EACA,iBAAAC,EACA,sBAAAC,EACA,mBAAAC,EACA,iBAAAC,MACK,kCAEP,OAAS,mCAAAC,MAAuC,oDAChD,OAAS,qBAAAC,MAAyB,gEAClC,OAAS,gBAAAC,MAAoB,2DAE7B,SAAS,eAAgB,IAAM,CAC7B,MAAMC,EAAUH,EAAgC,EAC1C,CAAE,YAAaI,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,cAAeN,EAAc,WAC7B,iBAAkB,EAClB,gBAAiBD,EAAgB,OACnC,CACF,EACAM,EAAgB,sBACdT,EAAqB,CAAE,KAAMU,CAAU,CAAC,CAC1C,EAEA,MAAMC,EAAS,MAAMJ,EAAaC,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,IAAIV,EAAmB,CACnC,UAAW,OACX,GAAGD,EAAc,MAAM,CACzB,CAAC,EACDQ,EAAgB,sBAAsBT,EAAqB,CAAE,MAAAY,CAAM,CAAC,CAAC,EAErE,MAAMD,EAAS,MAAMJ,EAAaC,CAAO,EAAE,EAE3C,OAAOG,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,EACjCA,EAAO,QAASE,GAAM,CACpB,OAAOA,CAAC,EAAE,eAAeP,CAAiB,EAC1C,OAAOO,EAAE,aAAa,EAAE,KAAKD,EAAM,aAAa,CAClD,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["CommandResultFactory", "GLOBAL_ERRORS", "GlobalCommandError", "OnboardingState", "SeedWordCount", "makeDeviceActionInternalApiMock", "GetOsVersionError", "getOsVersion", "apiMock", "sendCommandMock", "osVersion", "result", "error", "e"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{SecureChannelEventType as n,UserInteractionRequired as l,XStateDeviceAction as c}from"@ledgerhq/device-management-kit";import{Left as u,Right as
|
|
1
|
+
import{SecureChannelEventType as n,UserInteractionRequired as l,XStateDeviceAction as c}from"@ledgerhq/device-management-kit";import{Left as u,Right as d}from"purify-ts";import{assign as t,fromObservable as p,fromPromise as i,setup as h}from"xstate";import{getOsVersion as v}from"../../../../device-action/OsUpdate/Shared/Substeps/GetOsVersion";import{flashMcu as M}from"./Substeps/FlashMcu";import{resolveMcuVersion as m}from"./Substeps/ResolveMcuVersion";import{BootloaderModeTimeoutError as S}from"./FlashMcuDeviceActionErrors";import{FlashMcuSteps as a}from"./types";const s=10,D=2e3;class _ extends c{makeStateMachine(o){return h({types:{input:{},output:{},context:{}},actors:{getDeviceInfo:i(v(o)),resolveMcuVersion:i(m(o)),flashMcu:p(M(o))},delays:{bootloaderPollInterval:D},guards:{isDeviceInBootloaderMode:({context:e})=>e._internalState.deviceInfo?.isBootloader===!0,hasReachedMaxAttempts:({context:e})=>e._internalState.bootloaderPollAttempts>=s,hasError:({context:e})=>e._internalState.error!==null},actions:{assignErrorFromEvent:t({_internalState:e=>({...e.context._internalState,error:e.event.error})})}}).createMachine({id:"FlashMcuDeviceAction",initial:"GetDeviceInfo",context:({input:e})=>({input:e,intermediateValue:{requiredUserInteraction:l.None,step:a.Idle},_internalState:{error:null,deviceInfo:null,version:null,bootloaderPollAttempts:0}}),states:{GetDeviceInfo:{entry:t({intermediateValue:e=>({...e.context.intermediateValue,step:a.GetDeviceInfo}),_internalState:e=>({...e.context._internalState,bootloaderPollAttempts:e.context._internalState.bootloaderPollAttempts+1})}),invoke:{src:"getDeviceInfo",onDone:{actions:t({_internalState:e=>e.event.output.caseOf({Left:r=>({...e.context._internalState,error:r}),Right:r=>({...e.context._internalState,deviceInfo:r})})}),target:"CheckGetDeviceInfo"},onError:{actions:"assignErrorFromEvent",target:"Error"}}},CheckGetDeviceInfo:{always:[{guard:"hasError",target:"Error"},{guard:"isDeviceInBootloaderMode",target:"ResolveMcuVersion"},{guard:"hasReachedMaxAttempts",actions:t({_internalState:e=>({...e.context._internalState,error:new S(`Device did not enter bootloader mode after ${s} attempts`)})}),target:"Error"},{target:"WaitForBootloaderMode"}]},WaitForBootloaderMode:{after:{bootloaderPollInterval:{target:"GetDeviceInfo"}}},ResolveMcuVersion:{entry:t({intermediateValue:e=>({...e.context.intermediateValue,step:a.ResolveMcuVersion})}),invoke:{src:"resolveMcuVersion",input:({context:e})=>({...e.input,deviceInfo:e._internalState.deviceInfo}),onDone:{actions:t({_internalState:e=>e.event.output.caseOf({Left:r=>({...e.context._internalState,error:r}),Right:r=>({...e.context._internalState,version:r})})}),target:"CheckResolveMcuVersion"},onError:{actions:"assignErrorFromEvent",target:"Error"}}},CheckResolveMcuVersion:{always:[{guard:"hasError",target:"Error"},{target:"FlashMcuOrBootloader"}]},FlashMcuOrBootloader:{entry:t({intermediateValue:e=>({...e.context.intermediateValue,step:a.FlashMcuOrBootloader})}),invoke:{src:"flashMcu",input:({context:e})=>({deviceInfo:e._internalState.deviceInfo,version:e._internalState.version}),onSnapshot:{actions:t({intermediateValue:e=>e.event.snapshot.context?.type===n.Progress?{...e.context.intermediateValue,progress:e.event.snapshot.context.payload.progress}:{...e.context.intermediateValue},_internalState:e=>e.event.snapshot.context?.type===n.Error?{...e.context._internalState,error:e.event.snapshot.context.error.mapFlashMcuDAErrors()}:e.context._internalState})},onDone:{target:"CheckFlashMcu"},onError:{actions:"assignErrorFromEvent",target:"Error"}}},CheckFlashMcu:{always:[{guard:"hasError",target:"Error"},{target:"Success"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:e})=>e._internalState.error!==null?u(e._internalState.error):d(void 0)})}}export{_ as FlashMcuDeviceAction};
|
|
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": "AAAA,OAGE,0BAAAA,EAEA,2BAAAC,EACA,sBAAAC,MACK,kCACP,OAAS,QAAAC,EAAM,SAAAC,MAAa,YAC5B,OAAS,UAAAC,EAAQ,kBAAAC,EAAgB,eAAAC,EAAa,SAAAC,MAAa,SAE3D,OAAS,gBAAAC,MAAoB,2DAE7B,OAAS,YAAAC,MAAgB,sBACzB,OAAS,qBAAAC,MAAyB,+BAClC,OAAS,8BAAAC,MAAkC,+BAC3C,OAKE,iBAAAC,MACK,UAOP,MAAMC,EAA+B,GAC/BC,EAA8B,IAE7B,MAAMC,UAA6Bd,CAMxC,CACmB,iBACjBe,EAOA,CASA,OAAOT,EAAM,CACX,MAAO,CACL,MAAO,CAAC,EACR,OAAQ,CAAC,EACT,QAAS,CAAC,CACZ,EACA,OAAQ,CACN,cAAeD,EAAYE,EAAaQ,CAAW,CAAC,EACpD,kBAAmBV,EAAYI,EAAkBM,CAAW,CAAC,EAC7D,SAAUX,EAAeI,EAASO,CAAW,CAAC,CAChD,EACA,OAAQ,CACN,uBAAwBF,CAC1B,EACA,OAAQ,CACN,yBAA0B,CAAC,CAAE,QAAAG,CAAQ,IACnCA,EAAQ,eAAe,YAAY,eAAiB,GACtD,sBAAuB,CAAC,CAAE,QAAAA,CAAQ,IAChCA,EAAQ,eAAe,wBACvBJ,EACF,SAAU,CAAC,CAAE,QAAAI,CAAQ,IAAMA,EAAQ,eAAe,QAAU,IAC9D,EACA,QAAS,CACP,qBAAsBb,EAAO,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": ["SecureChannelEventType", "UserInteractionRequired", "XStateDeviceAction", "Left", "Right", "assign", "fromObservable", "fromPromise", "setup", "getOsVersion", "flashMcu", "resolveMcuVersion", "BootloaderModeTimeoutError", "FlashMcuSteps", "MAX_BOOTLOADER_POLL_ATTEMPTS", "BOOTLOADER_POLL_INTERVAL_MS", "FlashMcuDeviceAction", "internalApi", "context", "_", "input", "error", "getOsVersionResponse", "version"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{DeviceActionStatus as w,SecureChannelError as A,SecureChannelEventType as
|
|
1
|
+
import{DeviceActionStatus as w,OnboardingState as O,SecureChannelError as A,SecureChannelEventType as S,SeedWordCount as R,UnknownDAError as y,UserInteractionRequired as b}from"@ledgerhq/device-management-kit";import{Left as D,Right as h}from"purify-ts";import{Observable as k,of as F}from"rxjs";import{makeDeviceActionInternalApiMock as c}from"../../../../device-action/__test-utils__/makeInternalApi";import{testDeviceActionStates as l}from"../../../../device-action/__test-utils__/testDeviceActionStates";import{GetOsVersionError as x}from"../../../../device-action/OsUpdate/Shared/OsUpdateDeviceActionErrors";import{getOsVersion as V}from"../../../../device-action/OsUpdate/Shared/Substeps/GetOsVersion";import{FlashMcuDeviceAction as B}from"../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceAction";import{BootloaderModeTimeoutError as C,ResolveMcuVersionError as I}from"../../../../device-action/OsUpdate/Update/FlashMcu/FlashMcuDeviceActionErrors";import{flashMcu as T}from"../../../../device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu";import{resolveMcuVersion as G}from"../../../../device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion";import{FlashMcuSteps as e}from"../../../../device-action/OsUpdate/Update/FlashMcu/types";vi.mock("@api/device-action/OsUpdate/Shared/Substeps/GetOsVersion");vi.mock("@api/device-action/OsUpdate/Update/FlashMcu/Substeps/ResolveMcuVersion");vi.mock("@api/device-action/OsUpdate/Update/FlashMcu/Substeps/FlashMcu");const o=(s,f={})=>({status:w.Pending,intermediateValue:{requiredUserInteraction:b.None,step:s,...f}}),M=()=>({status:w.Completed,output:void 0}),v=s=>({status:w.Error,error:s}),E=s=>Array.from({length:s*2-1},()=>o(e.GetDeviceInfo));describe("FlashMcuDeviceAction",()=>{const s={isBootloader:!0,isOsu:!1,targetId:16777217,seTargetId:857735172,mcuTargetId:16777217,seVersion:"1.3.0",seFlags:new Uint8Array([230,0,0,0]),mcuSephVersion:"",mcuBootloaderVersion:"1.16",hwVersion:"00",langId:0,recoverState:void 0,secureElementFlags:{isPinValidated:!0,hasMcuSerialNumber:!0,hasValidCertificate:!0,isCustomAuthorityConnectionAllowed:!1,isSecureConnectionAllowed:!1,isOnboarded:!0,isMcuCodeSigned:!0,isInRecoveryMode:!1,hasEndorsementCertificateInSlot1:!1,hasEndorsementCertificateInSlot2:!1,numberOfWords:R.TwentyFour,currentWordIndex:0,onboardingState:O.Unknown}},f={id:300,version:"1.4.0",perso:"perso",firmware:"final",firmwareKey:"final-key",hash:"final-hash",bytes:123,mcuVersions:[1]};beforeEach(()=>{vi.resetAllMocks()});const u=(t=h(s))=>vi.mocked(V).mockReturnValue(()=>Promise.resolve(t)),g=t=>{const r=[...t];vi.mocked(V).mockReturnValue(()=>Promise.resolve(r.shift()??h(s)))},d=(t=h("1.12"))=>{const r=vi.fn().mockResolvedValue(t);return vi.mocked(G).mockReturnValue(r),r},p=(t=F())=>{const r=vi.fn().mockReturnValue(t);return vi.mocked(T).mockReturnValue(r),r},i=(t={mode:"osUpdate",finalFirmware:f})=>new B({input:t});describe("Success",()=>{it("Should flash the MCU when the device is already in bootloader mode",()=>new Promise((t,r)=>{u();const n=d(),a=p(),m=[o(e.GetDeviceInfo),o(e.ResolveMcuVersion),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),M()];l(i(),m,c(),{onDone:()=>{expect(n).toHaveBeenCalledWith(expect.objectContaining({input:{mode:"osUpdate",deviceInfo:s,finalFirmware:f}})),expect(a).toHaveBeenCalledWith(expect.objectContaining({input:{deviceInfo:s,version:"1.12"}})),t()},onError:r})})),it("Should flash the MCU in bootloader recovery mode without a final firmware",()=>new Promise((t,r)=>{u();const n=d(),a=p(),m=[o(e.GetDeviceInfo),o(e.ResolveMcuVersion),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),M()];l(i({mode:"bootloaderRecovery"}),m,c(),{onDone:()=>{expect(n).toHaveBeenCalledWith(expect.objectContaining({input:{mode:"bootloaderRecovery",deviceInfo:s}})),expect(a).toHaveBeenCalledWith(expect.objectContaining({input:{deviceInfo:s,version:"1.12"}})),t()},onError:r})})),it("Should poll until the device enters bootloader mode",async()=>{vi.useFakeTimers(),g([h({...s,isBootloader:!1}),h({...s,isBootloader:!1}),h(s)]),d(),p();const t=[...E(3),o(e.ResolveMcuVersion),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),M()],r=new Promise((n,a)=>{l(i(),t,c(),{onDone:n,onError:a})});await vi.advanceTimersByTimeAsync(2e3*3),await r,vi.useRealTimers()}),it("Should report the flash progress",()=>new Promise((t,r)=>{u(),d(),p(F({type:S.Progress,payload:{progress:.5,index:0,total:2}},{type:S.Progress,payload:{progress:1,index:1,total:2}}));const n=[o(e.GetDeviceInfo),o(e.ResolveMcuVersion),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader,{progress:.5}),o(e.FlashMcuOrBootloader,{progress:1}),M()];l(i(),n,c(),{onDone:t,onError:r})}))}),describe("Error",()=>{it("Should go to Error when getOsVersion returns Left",()=>new Promise((t,r)=>{const n=new x(new Error("command failed"));u(D(n));const a=[o(e.GetDeviceInfo),v(n)];l(i(),a,c(),{onDone:t,onError:r})})),it("Should go to Error when the device never enters bootloader mode",async()=>{vi.useFakeTimers(),u(h({...s,isBootloader:!1}));const t=[...E(10),v(new C("Device did not enter bootloader mode after 10 attempts"))],r=new Promise((n,a)=>{l(i(),t,c(),{onDone:n,onError:a})});await vi.advanceTimersByTimeAsync(2e3*11),await r,vi.useRealTimers()}),it("Should go to Error when resolveMcuVersion returns Left",()=>new Promise((t,r)=>{u();const n=new I("no compatible MCU");d(D(n));const a=[o(e.GetDeviceInfo),o(e.ResolveMcuVersion),v(n)];l(i(),a,c(),{onDone:t,onError:r})})),it("Should map a secure channel error event to a device action error",()=>new Promise((t,r)=>{u(),d(),p(F({type:S.Error,error:new A("flash failed")}));const n=[o(e.GetDeviceInfo),o(e.ResolveMcuVersion),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),v(new y)];l(i(),n,c(),{onDone:t,onError:r})})),it("Should go to Error when the secure channel connection cannot be opened",()=>new Promise((t,r)=>{u(),d();const n=new y("Invalid WebSocket connection");p(new k(m=>{m.error(n)}));const a=[o(e.GetDeviceInfo),o(e.ResolveMcuVersion),o(e.FlashMcuOrBootloader),o(e.FlashMcuOrBootloader),v(n)];l(i(),a,c(),{onDone:t,onError:r})}))})});
|
|
2
2
|
//# sourceMappingURL=FlashMcuDeviceAction.test.js.map
|