@ledgerhq/device-management-kit 0.0.0-develop-20260531003330 → 0.0.0-develop-20260602003742

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.
@@ -63,5 +63,5 @@
63
63
  "watch:builds": "pnpm ldmk-tool watch --entryPoints index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
64
64
  "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
65
65
  },
66
- "version": "0.0.0-develop-20260531003330"
66
+ "version": "0.0.0-develop-20260602003742"
67
67
  }
@@ -1,2 +1,2 @@
1
- "use strict";var V=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var F=Object.prototype.hasOwnProperty;var I=(a,r)=>{for(var c in r)V(a,c,{get:r[c],enumerable:!0})},N=(a,r,c,d)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of w(r))!F.call(a,n)&&n!==c&&V(a,n,{get:()=>r[n],enumerable:!(d=x(r,n))||d.enumerable});return a};var R=a=>N(V({},"__esModule",{value:!0}),a);var _={};I(_,{GetDeviceStatusDeviceAction:()=>T});module.exports=R(_);var D=require("purify-ts"),o=require("rxjs"),k=require("rxjs/operators"),t=require("xstate"),l=require("../../../command/model/CommandResult"),g=require("../../../command/os/GetAppAndVersionCommand"),E=require("../../../command/os/GetOsVersionCommand"),C=require("../../../device/DeviceStatus"),p=require("../../../device-action/model/UserInteractionRequired"),h=require("../../../device-action/os/Const"),v=require("../../../device-action/os/Errors"),G=require("../../../device-action/xstate-utils/XStateDeviceAction"),m=require("../../../device-session/DeviceSessionState"),S=require("./types");const f=a=>({mcu:a.mcuSephVersion,bootloader:a.mcuBootloaderVersion,os:a.seVersion,metadata:a});class T extends G.XStateDeviceAction{makeStateMachine(r){const{getAppAndVersion:c,getOsVersion:d,getDeviceSessionState:n,setDeviceSessionState:u,waitForDeviceUnlock:O}=this.extractDependencies(r),y=this.input.unlockTimeout??h.DEFAULT_UNLOCK_TIMEOUT_MS,b=e=>{const i=n();"firmwareVersion"in i&&u({...i,firmwareVersion:f(e),isSecureConnectionAllowed:e.secureElementFlags.isSecureConnectionAllowed})},A=()=>{const e=n();if("firmwareVersion"in e)return e.firmwareVersion?.metadata};return(0,t.setup)({types:{input:{unlockTimeout:y},context:{},output:{}},actors:{getAppAndVersion:(0,t.fromPromise)(c),getOsVersion:(0,t.fromPromise)(d),waitForDeviceUnlock:(0,t.fromObservable)(O)},guards:{isOnboardedFromCachedMetadata:()=>A()?.secureElementFlags.isOnboarded===!0,isNotOnboardedFromCachedMetadata:()=>{const e=A();return e!==void 0&&!e.secureElementFlags.isOnboarded},needsOsVersionFetch:()=>A()===void 0,isOnboardedFromOsVersion:({context:e})=>e._internalState.osVersionMetadata?.secureElementFlags.isOnboarded===!0,isDeviceLocked:({context:e})=>e._internalState.locked,hasError:({context:e})=>e._internalState.error!==null},actions:{assignErrorDeviceNotOnboarded:(0,t.assign)({_internalState:e=>({...e.context._internalState,error:new v.DeviceNotOnboardedError})}),assignErrorDeviceLocked:(0,t.assign)({_internalState:e=>({...e.context._internalState,error:new v.DeviceLockedError}),intermediateValue:{requiredUserInteraction:p.UserInteractionRequired.UnlockDevice,step:S.getDeviceStatusDAStateStep.UNLOCK_DEVICE}}),assignErrorFromEvent:(0,t.assign)({_internalState:e=>({...e.context._internalState,error:e.event.error})}),assignNoUserActionNeeded:(0,t.assign)({intermediateValue:e=>({...e.context.intermediateValue,requiredUserInteraction:p.UserInteractionRequired.None})}),assignUserActionUnlockNeeded:(0,t.assign)({intermediateValue:e=>({...e.context.intermediateValue,requiredUserInteraction:p.UserInteractionRequired.UnlockDevice,step:S.getDeviceStatusDAStateStep.UNLOCK_DEVICE})})}}).createMachine({id:"GetDeviceStatusDeviceAction",initial:"DeviceReady",context:e=>{const i=n(),{sessionStateType:s}=i;return{input:{unlockTimeout:e.input.unlockTimeout},intermediateValue:{requiredUserInteraction:p.UserInteractionRequired.None,step:S.getDeviceStatusDAStateStep.ONBOARD_CHECK},_internalState:{onboarded:!1,locked:!1,currentApp:s===m.DeviceSessionStateType.ReadyWithoutSecureChannel?i.currentApp.name:null,currentAppVersion:null,osVersionMetadata:null,error:null}}},states:{DeviceReady:{always:{target:"OnboardingCheck"}},OnboardingCheck:{always:[{guard:"isOnboardedFromCachedMetadata",target:"AppAndVersionCheck",actions:(0,t.assign)({_internalState:e=>({...e.context._internalState,onboarded:!0})})},{guard:"isNotOnboardedFromCachedMetadata",target:"Error",actions:"assignErrorDeviceNotOnboarded"},{guard:"needsOsVersionFetch",target:"GetOsVersion"}]},GetOsVersion:{invoke:{src:"getOsVersion",onDone:{target:"OnboardingResultCheck",actions:(0,t.assign)({_internalState:e=>(0,l.isSuccessCommandResult)(e.event.output)?(b(e.event.output.data),{...e.context._internalState,osVersionMetadata:e.event.output.data}):{...e.context._internalState,error:e.event.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},OnboardingResultCheck:{always:[{guard:"hasError",target:"Error"},{guard:"isOnboardedFromOsVersion",target:"AppAndVersionCheck",actions:(0,t.assign)({_internalState:e=>({...e.context._internalState,onboarded:!0})})},{target:"Error",actions:"assignErrorDeviceNotOnboarded"}]},UserActionUnlockDevice:{entry:"assignUserActionUnlockNeeded",exit:"assignNoUserActionNeeded",invoke:{id:"UserActionUnlockDevice",src:"waitForDeviceUnlock",input:e=>({unlockTimeout:y}),onDone:{target:"AppAndVersionCheck",actions:(0,t.assign)({_internalState:e=>({...e.context._internalState,locked:!1})})},onError:{target:"Error",actions:"assignErrorDeviceLocked"}}},AppAndVersionCheck:{invoke:{src:"getAppAndVersion",onDone:{target:"ApplicationAvailableResultCheck",actions:(0,t.assign)({_internalState:e=>{if((0,l.isSuccessCommandResult)(e.event.output)){const i=n();if(i.sessionStateType!==m.DeviceSessionStateType.Connected)u({...i,currentApp:e.event.output.data});else{const s=e.context._internalState.osVersionMetadata;u({deviceModelId:i.deviceModelId,sessionStateType:m.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:C.DeviceStatus.CONNECTED,currentApp:e.event.output.data,installedApps:[],isSecureConnectionAllowed:s?.secureElementFlags.isSecureConnectionAllowed??!1,...s!==null?{firmwareVersion:f(s)}:{}})}return{...e.context._internalState,locked:!1,currentApp:e.event.output.data.name,currentAppVersion:e.event.output.data.version}}if("errorCode"in e.event.output.error){if(e.event.output.error.errorCode==="5515")return{...e.context._internalState,locked:!0};if(e.event.output.error.errorCode==="6e00")return{...e.context._internalState,locked:!1,currentApp:"BOLOS",currentAppVersion:"0.0.0"}}return{...e.context._internalState,error:e.event.output.error}}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},ApplicationAvailableResultCheck:{always:[{guard:"hasError",target:"Error"},{target:"UserActionUnlockDevice",guard:"isDeviceLocked"},{target:"Success"}]},Success:{type:"final"},Error:{type:"final"}},output:e=>{const{context:i}=e,{error:s,currentApp:M,currentAppVersion:U}=i._internalState;return s?(0,D.Left)(s):(0,D.Right)({currentApp:M,currentAppVersion:U})}})}extractDependencies(r){return{getAppAndVersion:()=>r.sendCommand(new g.GetAppAndVersionCommand),getOsVersion:()=>r.sendCommand(new E.GetOsVersionCommand),waitForDeviceUnlock:({input:n})=>(0,o.interval)(1e3).pipe((0,o.switchMap)(()=>(0,o.from)(r.sendCommand(new g.GetAppAndVersionCommand))),(0,o.mergeMap)(u=>!(0,l.isSuccessCommandResult)(u)&&"errorCode"in u.error&&u.error.errorCode==="5515"?o.EMPTY:(0,o.of)(void 0)),(0,o.take)(1),(0,k.timeout)(n.unlockTimeout)),getDeviceSessionState:()=>r.getDeviceSessionState(),setDeviceSessionState:n=>r.setDeviceSessionState(n)}}}0&&(module.exports={GetDeviceStatusDeviceAction});
1
+ "use strict";var A=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var M=(o,r)=>{for(var s in r)A(o,s,{get:r[s],enumerable:!0})},w=(o,r,s,u)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of b(r))!I.call(o,i)&&i!==s&&A(o,i,{get:()=>r[i],enumerable:!(u=x(r,i))||u.enumerable});return o};var R=o=>w(A({},"__esModule",{value:!0}),o);var N={};M(N,{GetDeviceStatusDeviceAction:()=>F});module.exports=R(N);var D=require("purify-ts"),n=require("rxjs"),k=require("rxjs/operators"),t=require("xstate"),S=require("../../../command/model/CommandResult"),V=require("../../../command/os/GetAppAndVersionCommand"),O=require("../../../command/os/GetOsVersionCommand"),f=require("../../../device/DeviceStatus"),p=require("../../../device-action/model/UserInteractionRequired"),E=require("../../../device-action/os/Const"),v=require("../../../device-action/os/Errors"),C=require("../../../device-action/xstate-utils/XStateDeviceAction"),l=require("../../../device-session/DeviceSessionState"),m=require("./types");const T=o=>({mcu:o.mcuSephVersion,bootloader:o.mcuBootloaderVersion,os:o.seVersion,metadata:o});class F extends C.XStateDeviceAction{makeStateMachine(r){const{getAppAndVersion:s,getOsVersion:u,getDeviceSessionState:i,setDeviceSessionState:c,waitForDeviceUnlock:g}=this.extractDependencies(r),y=this.input.unlockTimeout??E.DEFAULT_UNLOCK_TIMEOUT_MS,G=e=>{const a=i();a.sessionStateType!==l.DeviceSessionStateType.Connected&&c({...a,firmwareVersion:T(e),isSecureConnectionAllowed:e.secureElementFlags.isSecureConnectionAllowed})};return(0,t.setup)({types:{input:{unlockTimeout:y},context:{},output:{}},actors:{getAppAndVersion:(0,t.fromPromise)(s),getOsVersion:(0,t.fromPromise)(u),waitForDeviceUnlock:(0,t.fromObservable)(g)},guards:{isCurrentAppBolos:({context:e})=>e._internalState.currentApp==="BOLOS",isOnboardedFromOsVersion:({context:e})=>e._internalState.osVersionMetadata?.secureElementFlags.isOnboarded===!0,isDeviceLocked:({context:e})=>e._internalState.locked,hasError:({context:e})=>e._internalState.error!==null},actions:{assignErrorDeviceNotOnboarded:(0,t.assign)({_internalState:e=>({...e.context._internalState,error:new v.DeviceNotOnboardedError})}),assignErrorDeviceLocked:(0,t.assign)({_internalState:e=>({...e.context._internalState,error:new v.DeviceLockedError}),intermediateValue:{requiredUserInteraction:p.UserInteractionRequired.UnlockDevice,step:m.getDeviceStatusDAStateStep.UNLOCK_DEVICE}}),assignErrorFromEvent:(0,t.assign)({_internalState:e=>({...e.context._internalState,error:e.event.error})}),assignNoUserActionNeeded:(0,t.assign)({intermediateValue:e=>({...e.context.intermediateValue,requiredUserInteraction:p.UserInteractionRequired.None})}),assignUserActionUnlockNeeded:(0,t.assign)({intermediateValue:e=>({...e.context.intermediateValue,requiredUserInteraction:p.UserInteractionRequired.UnlockDevice,step:m.getDeviceStatusDAStateStep.UNLOCK_DEVICE})})}}).createMachine({id:"GetDeviceStatusDeviceAction",initial:"DeviceReady",context:e=>{const a=i(),{sessionStateType:d}=a;return{input:{unlockTimeout:e.input.unlockTimeout},intermediateValue:{requiredUserInteraction:p.UserInteractionRequired.None,step:m.getDeviceStatusDAStateStep.ONBOARD_CHECK},_internalState:{onboarded:!1,locked:!1,currentApp:d===l.DeviceSessionStateType.ReadyWithoutSecureChannel?a.currentApp.name:null,currentAppVersion:null,osVersionMetadata:null,error:null}}},states:{DeviceReady:{always:{target:"AppAndVersionCheck"}},AppAndVersionCheck:{invoke:{src:"getAppAndVersion",onDone:{target:"ApplicationAvailableResultCheck",actions:(0,t.assign)({_internalState:e=>{if((0,S.isSuccessCommandResult)(e.event.output)){const a=i();return a.sessionStateType!==l.DeviceSessionStateType.Connected?c({...a,currentApp:e.event.output.data}):c({deviceModelId:a.deviceModelId,sessionStateType:l.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:f.DeviceStatus.CONNECTED,currentApp:e.event.output.data,installedApps:[],isSecureConnectionAllowed:!1}),{...e.context._internalState,locked:!1,currentApp:e.event.output.data.name,currentAppVersion:e.event.output.data.version}}if("errorCode"in e.event.output.error){if(e.event.output.error.errorCode==="5515")return{...e.context._internalState,locked:!0};if(e.event.output.error.errorCode==="6e00")return{...e.context._internalState,locked:!1,currentApp:"BOLOS",currentAppVersion:"0.0.0"}}return{...e.context._internalState,error:e.event.output.error}}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},ApplicationAvailableResultCheck:{always:[{guard:"hasError",target:"Error"},{target:"UserActionUnlockDevice",guard:"isDeviceLocked"},{target:"OnboardingCheck"}]},OnboardingCheck:{always:[{guard:"isCurrentAppBolos",target:"GetOsVersion"},{target:"Success",actions:(0,t.assign)({_internalState:e=>({...e.context._internalState,onboarded:!0})})}]},GetOsVersion:{invoke:{src:"getOsVersion",onDone:{target:"OnboardingResultCheck",actions:(0,t.assign)({_internalState:e=>(0,S.isSuccessCommandResult)(e.event.output)?(G(e.event.output.data),{...e.context._internalState,osVersionMetadata:e.event.output.data}):{...e.context._internalState,error:e.event.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},OnboardingResultCheck:{always:[{guard:"hasError",target:"Error"},{guard:"isOnboardedFromOsVersion",target:"Success",actions:(0,t.assign)({_internalState:e=>({...e.context._internalState,onboarded:!0})})},{target:"Error",actions:"assignErrorDeviceNotOnboarded"}]},UserActionUnlockDevice:{entry:"assignUserActionUnlockNeeded",exit:"assignNoUserActionNeeded",invoke:{id:"UserActionUnlockDevice",src:"waitForDeviceUnlock",input:e=>({unlockTimeout:y}),onDone:{target:"AppAndVersionCheck",actions:(0,t.assign)({_internalState:e=>({...e.context._internalState,locked:!1})})},onError:{target:"Error",actions:"assignErrorDeviceLocked"}}},Success:{type:"final"},Error:{type:"final"}},output:e=>{const{context:a}=e,{error:d,currentApp:h,currentAppVersion:U}=a._internalState;return d?(0,D.Left)(d):(0,D.Right)({currentApp:h,currentAppVersion:U})}})}extractDependencies(r){return{getAppAndVersion:()=>r.sendCommand(new V.GetAppAndVersionCommand),getOsVersion:()=>r.sendCommand(new O.GetOsVersionCommand),waitForDeviceUnlock:({input:i})=>(0,n.interval)(1e3).pipe((0,n.switchMap)(()=>(0,n.from)(r.sendCommand(new V.GetAppAndVersionCommand))),(0,n.mergeMap)(c=>!(0,S.isSuccessCommandResult)(c)&&"errorCode"in c.error&&c.error.errorCode==="5515"?n.EMPTY:(0,n.of)(void 0)),(0,n.take)(1),(0,k.timeout)(i.unlockTimeout)),getDeviceSessionState:()=>r.getDeviceSessionState(),setDeviceSessionState:i=>r.setDeviceSessionState(i)}}}0&&(module.exports={GetDeviceStatusDeviceAction});
2
2
  //# sourceMappingURL=GetDeviceStatusDeviceAction.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.ts"],
4
- "sourcesContent": ["import { Left, Right } from \"purify-ts\";\nimport {\n EMPTY,\n from,\n interval,\n mergeMap,\n type Observable,\n of,\n switchMap,\n take,\n} from \"rxjs\";\nimport { timeout } from \"rxjs/operators\";\nimport { assign, fromObservable, fromPromise, setup } from \"xstate\";\n\nimport { isSuccessCommandResult } from \"@api/command/model/CommandResult\";\nimport {\n GetAppAndVersionCommand,\n type GetAppAndVersionCommandResult,\n} from \"@api/command/os/GetAppAndVersionCommand\";\nimport {\n GetOsVersionCommand,\n type GetOsVersionCommandResult,\n type GetOsVersionResponse,\n} from \"@api/command/os/GetOsVersionCommand\";\nimport { DeviceStatus } from \"@api/device/DeviceStatus\";\nimport { type InternalApi } from \"@api/device-action/DeviceAction\";\nimport { UserInteractionRequired } from \"@api/device-action/model/UserInteractionRequired\";\nimport { DEFAULT_UNLOCK_TIMEOUT_MS } from \"@api/device-action/os/Const\";\nimport {\n DeviceLockedError,\n DeviceNotOnboardedError,\n} from \"@api/device-action/os/Errors\";\nimport { type StateMachineTypes } from \"@api/device-action/xstate-utils/StateMachineTypes\";\nimport {\n type DeviceActionStateMachine,\n XStateDeviceAction,\n} from \"@api/device-action/xstate-utils/XStateDeviceAction\";\nimport {\n type DeviceSessionState,\n DeviceSessionStateType,\n type FirmwareVersion,\n} from \"@api/device-session/DeviceSessionState\";\n\nimport {\n type GetDeviceStatusDAError,\n type GetDeviceStatusDAInput,\n type GetDeviceStatusDAIntermediateValue,\n type GetDeviceStatusDAOutput,\n getDeviceStatusDAStateStep,\n} from \"./types\";\n\ntype GetDeviceStatusMachineInternalState = {\n readonly onboarded: boolean;\n readonly locked: boolean;\n readonly currentApp: string | null;\n readonly currentAppVersion: string | null;\n readonly osVersionMetadata: GetOsVersionResponse | null;\n readonly error: GetDeviceStatusDAError | null;\n};\n\nexport type MachineDependencies = {\n readonly getAppAndVersion: () => Promise<GetAppAndVersionCommandResult>;\n readonly getOsVersion: () => Promise<GetOsVersionCommandResult>;\n readonly getDeviceSessionState: () => DeviceSessionState;\n readonly waitForDeviceUnlock: (args: {\n input: { unlockTimeout: number };\n }) => Observable<void>;\n readonly setDeviceSessionState: (\n state: DeviceSessionState,\n ) => DeviceSessionState;\n};\n\nconst firmwareVersionFromOsVersion = (\n data: GetOsVersionResponse,\n): FirmwareVersion => ({\n mcu: data.mcuSephVersion,\n bootloader: data.mcuBootloaderVersion,\n os: data.seVersion,\n metadata: data,\n});\n\nexport type ExtractMachineDependencies = (\n internalApi: InternalApi,\n) => MachineDependencies;\n\nexport class GetDeviceStatusDeviceAction extends XStateDeviceAction<\n GetDeviceStatusDAOutput,\n GetDeviceStatusDAInput,\n GetDeviceStatusDAError,\n GetDeviceStatusDAIntermediateValue,\n GetDeviceStatusMachineInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n GetDeviceStatusDAOutput,\n GetDeviceStatusDAInput,\n GetDeviceStatusDAError,\n GetDeviceStatusDAIntermediateValue,\n GetDeviceStatusMachineInternalState\n > {\n type types = StateMachineTypes<\n GetDeviceStatusDAOutput,\n GetDeviceStatusDAInput,\n GetDeviceStatusDAError,\n GetDeviceStatusDAIntermediateValue,\n GetDeviceStatusMachineInternalState\n >;\n\n const {\n getAppAndVersion,\n getOsVersion,\n getDeviceSessionState,\n setDeviceSessionState,\n waitForDeviceUnlock,\n } = this.extractDependencies(internalApi);\n\n const unlockTimeout = this.input.unlockTimeout ?? DEFAULT_UNLOCK_TIMEOUT_MS;\n\n const updateSessionFromOsVersion = (data: GetOsVersionResponse) => {\n const currentState = getDeviceSessionState();\n if (!(\"firmwareVersion\" in currentState)) {\n return;\n }\n setDeviceSessionState({\n ...currentState,\n firmwareVersion: firmwareVersionFromOsVersion(data),\n isSecureConnectionAllowed:\n data.secureElementFlags.isSecureConnectionAllowed,\n });\n };\n\n const getCachedOnboardingMetadata = () => {\n const state = getDeviceSessionState();\n if (!(\"firmwareVersion\" in state)) {\n return undefined;\n }\n return state.firmwareVersion?.metadata;\n };\n\n return setup({\n types: {\n input: {\n unlockTimeout,\n } as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n getAppAndVersion: fromPromise(getAppAndVersion),\n getOsVersion: fromPromise(getOsVersion),\n waitForDeviceUnlock: fromObservable(waitForDeviceUnlock),\n },\n guards: {\n isOnboardedFromCachedMetadata: () => {\n const metadata = getCachedOnboardingMetadata();\n return metadata?.secureElementFlags.isOnboarded === true;\n },\n isNotOnboardedFromCachedMetadata: () => {\n const metadata = getCachedOnboardingMetadata();\n return (\n metadata !== undefined && !metadata.secureElementFlags.isOnboarded\n );\n },\n needsOsVersionFetch: () => getCachedOnboardingMetadata() === undefined,\n isOnboardedFromOsVersion: ({ context }) =>\n context._internalState.osVersionMetadata?.secureElementFlags\n .isOnboarded === true,\n isDeviceLocked: ({ context }) => context._internalState.locked,\n hasError: ({ context }) => context._internalState.error !== null,\n },\n actions: {\n assignErrorDeviceNotOnboarded: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new DeviceNotOnboardedError(),\n }),\n }),\n assignErrorDeviceLocked: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new DeviceLockedError(),\n }),\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n step: getDeviceStatusDAStateStep.UNLOCK_DEVICE,\n },\n }),\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: _.event[\"error\"], // NOTE: it should never happen, the error is not typed anymore here\n }),\n }),\n assignNoUserActionNeeded: assign({\n intermediateValue: (_) =>\n ({\n ..._.context.intermediateValue,\n requiredUserInteraction: UserInteractionRequired.None,\n }) satisfies types[\"context\"][\"intermediateValue\"],\n }),\n assignUserActionUnlockNeeded: assign({\n intermediateValue: (_) =>\n ({\n ..._.context.intermediateValue,\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n step: getDeviceStatusDAStateStep.UNLOCK_DEVICE,\n }) satisfies types[\"context\"][\"intermediateValue\"],\n }),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QHEwBcAiYBuBLAxmAMpoCGaArrFnoQIL5q4D2AdgHQ0FgBKYpEAJ4BiANoAGALqJQAB2axcTNjJAAPRAFoArAHZx7AIwAmQ7oCcugMyHzANmMAWYwBoQgxI8vsAHOJM+VuLmVj5e2gC+EW6omDjcJORUXPSMLBwA8qwARsykAE4QuKxQAMIAFmD4ANZiUqryisqsqhoImo4O7OGhPj4h5n6Obh4IunZ2RoZ+ena6nYaGUTHoKcRklNTxqc3sWbkFRSUVVbWihtJIII1K6a1aVtoGTxOOjtbv84YjiObik7ofPM7GFDP9jNofMsQLE1olNmsGLsADLMGrFMqVGp1S5yBS3FRXNqaOzadjiHx2KyORbzcRBczmH4IbTOdjaabaKmdGy6XSRaIw1bbdZJLa0MBI9LsVHo45Ys4XBr45r3dps-n0ubaGxgx6PZlWULkkLBGmDCzGYzQ2Ei+HJEVStjsACqsDA+SdrBdrAANmjqmthBA2GB2MVsMxqmG3R6vT7-TU1hJcdcVXciYgglZycYQiYqRTQoZtMynDmbM4aW8rHYzD4BSs4hL7eLuF7Xe7PWk2AmA0GPflmPl2LJfeQAGbDgC2nbjPe9fv7IpTyqaGdAbXmxnZPkMNNM820VuZ+8M7Dsb3MznpwW31sFtpbGwdEo7dFksjorAgADUPYobAnNiIasGGEZRmGT4JC+bY7NKH5fj+-75IBrDAdUCAQfg5DpCmq5XDcqqZmMjgGDY-yGJeejjFRzJ2P47DZoEJb+Hyx42sKz5ioiC7sIh35-gB6QYcIg7DqO45oFO+SztBhCtrxuwCchwlAQqWGsJGOHNPh9SEemhKbogdLsIMTjmPuNF1nYZaOBW+5OPu9l1oCjZCs2ME8Y6fGIb6BC4WwdDYKQuDjtkvq8HAFC+mgokEXi65GeoiBguYZJOPSJa6Hm1hGsyuglkxxiUjYVjXlq7nyaKCI+cpn7+Tp6TBaF4WRXwsAxXFCpiEqBlJS0JFAo4vg+BCe55e8-QFUVVglVShjlWRtZ2FEgqsMwEBwKo1WKXVG5pgNaokmRZmQg4fyLHR7ieCNpjGPyx7aNo6UNo4nGeQpsFKdKax8AIoyJQSg3Ge0L07q9F3+Istk3Qg1IjUaZ7GNS-LlU4H1wt9+3OvseSFBiGFrsDx01mZ15mHooReFaVj0fZ5Jci5zissYIKY3a2NvnxsrVITCrE8RoMdDucxWgx1jpZCELDHDgKTC9jg6mNXKLDSHPcbV3O7LG3bNH2SYioLB3EmCI1-HuVL6Cj4hU6eNjsIVD3UrWfKXVCj5cV5Wvtr5n6CShaFE-1JMkWzPgXpCjh+Faw3Mjq5jdOlJhGvo-RzRr3uvr79VjgFzQtWFpARVFnWxcHQNCylCBm+eKPjJL4jWMEdNww4O46vSFVsfyD5Nlj3na9KRAUPghCwPAIdV20QIR7e-RzOYbNK98cN7ndgR-BSzgo+YmdfYPOfSgAovkQ75MbyVtItehmSrJgcijz2uHD+pmXyQSQnyVLs2tQA */\n id: \"GetDeviceStatusDeviceAction\",\n initial: \"DeviceReady\",\n context: (_) => {\n const sessionState = getDeviceSessionState();\n const { sessionStateType } = sessionState;\n return {\n input: {\n unlockTimeout: _.input.unlockTimeout,\n },\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n _internalState: {\n onboarded: false,\n locked: false,\n currentApp:\n sessionStateType ===\n DeviceSessionStateType.ReadyWithoutSecureChannel\n ? sessionState.currentApp.name\n : null,\n currentAppVersion: null,\n osVersionMetadata: null,\n error: null,\n },\n };\n },\n states: {\n DeviceReady: {\n always: {\n target: \"OnboardingCheck\",\n },\n },\n OnboardingCheck: {\n always: [\n {\n guard: \"isOnboardedFromCachedMetadata\",\n target: \"AppAndVersionCheck\",\n actions: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n onboarded: true,\n }),\n }),\n },\n {\n guard: \"isNotOnboardedFromCachedMetadata\",\n target: \"Error\",\n actions: \"assignErrorDeviceNotOnboarded\",\n },\n {\n guard: \"needsOsVersionFetch\",\n target: \"GetOsVersion\",\n },\n ],\n },\n GetOsVersion: {\n invoke: {\n src: \"getOsVersion\",\n onDone: {\n target: \"OnboardingResultCheck\",\n actions: assign({\n _internalState: (_) => {\n if (isSuccessCommandResult(_.event.output)) {\n updateSessionFromOsVersion(_.event.output.data);\n return {\n ..._.context._internalState,\n osVersionMetadata: _.event.output.data,\n };\n }\n return {\n ..._.context._internalState,\n error: _.event.output.error,\n };\n },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n OnboardingResultCheck: {\n always: [\n {\n guard: \"hasError\",\n target: \"Error\",\n },\n {\n guard: \"isOnboardedFromOsVersion\",\n target: \"AppAndVersionCheck\",\n actions: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n onboarded: true,\n }),\n }),\n },\n {\n target: \"Error\",\n actions: \"assignErrorDeviceNotOnboarded\",\n },\n ],\n },\n UserActionUnlockDevice: {\n // we wait for the device to be unlocked (default timeout is 15s)\n entry: \"assignUserActionUnlockNeeded\",\n exit: \"assignNoUserActionNeeded\",\n invoke: {\n id: \"UserActionUnlockDevice\",\n src: \"waitForDeviceUnlock\",\n input: (_) => ({\n unlockTimeout,\n }),\n onDone: {\n target: \"AppAndVersionCheck\",\n actions: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n locked: false,\n }),\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorDeviceLocked\",\n },\n },\n },\n AppAndVersionCheck: {\n // We check the current app and version using the getAppAndVersion command\n invoke: {\n src: \"getAppAndVersion\",\n onDone: {\n target: \"ApplicationAvailableResultCheck\",\n actions: assign({\n _internalState: (_) => {\n if (isSuccessCommandResult(_.event.output)) {\n const state: DeviceSessionState = getDeviceSessionState();\n if (\n state.sessionStateType !==\n DeviceSessionStateType.Connected\n ) {\n // Update the current app\n setDeviceSessionState({\n ...state,\n currentApp: _.event.output.data,\n });\n } else {\n const osVersionMetadata =\n _.context._internalState.osVersionMetadata;\n // The device can be set to Ready if GetAppAndVersionCommand was successful\n setDeviceSessionState({\n deviceModelId: state.deviceModelId,\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: _.event.output.data,\n installedApps: [],\n isSecureConnectionAllowed:\n osVersionMetadata?.secureElementFlags\n .isSecureConnectionAllowed ?? false,\n ...(osVersionMetadata !== null\n ? {\n firmwareVersion:\n firmwareVersionFromOsVersion(osVersionMetadata),\n }\n : {}),\n });\n }\n return {\n ..._.context._internalState,\n locked: false,\n currentApp: _.event.output.data.name,\n currentAppVersion: _.event.output.data.version,\n };\n }\n if (\"errorCode\" in _.event.output.error) {\n if (_.event.output.error.errorCode === \"5515\") {\n // Locked device error\n return {\n ..._.context._internalState,\n locked: true,\n };\n } else if (_.event.output.error.errorCode === \"6e00\") {\n // CLA not supported\n // GetAppAndVersion should always be supported by the firmware or any app.\n // But on old firmware versions, that APDU was not supported in the dashboard.\n // On those firmwares, it fails with CLA_NOT_SUPPORTED in BOLOS, and INS_NOT_SUPPORTED\n // in applications. Therefore if CLA is not supported, we can consider we're on the\n // dashboard on an old firmware. We should therefore return that information to\n // ensure the user can still update his firmware and is not blocked at this step.\n return {\n ..._.context._internalState,\n locked: false,\n currentApp: \"BOLOS\",\n currentAppVersion: \"0.0.0\",\n };\n }\n }\n return {\n ..._.context._internalState,\n error: _.event.output.error,\n };\n },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ApplicationAvailableResultCheck: {\n always: [\n {\n guard: \"hasError\",\n target: \"Error\",\n },\n {\n target: \"UserActionUnlockDevice\",\n guard: \"isDeviceLocked\",\n },\n {\n target: \"Success\",\n },\n ],\n },\n Success: {\n type: \"final\",\n },\n Error: {\n type: \"final\",\n },\n },\n output: (args) => {\n // TODO: instead we should rely on the current state (\"Success\" or \"Error\")\n const { context } = args;\n const { error, currentApp, currentAppVersion } = context._internalState;\n if (error) {\n return Left(error);\n }\n return Right<GetDeviceStatusDAOutput>({\n currentApp: currentApp!,\n currentAppVersion: currentAppVersion!,\n });\n },\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppAndVersion = () => {\n return internalApi.sendCommand(new GetAppAndVersionCommand());\n };\n\n const waitForDeviceUnlock = ({\n input,\n }: {\n input: { unlockTimeout: number };\n }) =>\n interval(1000).pipe(\n switchMap(() =>\n from(internalApi.sendCommand(new GetAppAndVersionCommand())),\n ),\n mergeMap((output) => {\n const isLocked =\n !isSuccessCommandResult(output) &&\n \"errorCode\" in output.error &&\n output.error.errorCode === \"5515\";\n if (isLocked) {\n return EMPTY; // Continue the polling\n }\n return of(undefined); // Complete the observable\n }),\n take(1),\n timeout(input.unlockTimeout),\n );\n\n return {\n getAppAndVersion,\n getOsVersion: () => internalApi.sendCommand(new GetOsVersionCommand()),\n waitForDeviceUnlock,\n getDeviceSessionState: () => internalApi.getDeviceSessionState(),\n setDeviceSessionState: (state: DeviceSessionState) =>\n internalApi.setDeviceSessionState(state),\n };\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iCAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA4B,qBAC5BC,EASO,gBACPC,EAAwB,0BACxBC,EAA2D,kBAE3DC,EAAuC,4CACvCC,EAGO,mDACPC,EAIO,+CACPC,EAA6B,oCAE7BC,EAAwC,4DACxCC,EAA0C,uCAC1CC,EAGO,wCAEPC,EAGO,8DACPC,EAIO,kDAEPC,EAMO,mBAuBP,MAAMC,EACJC,IACqB,CACrB,IAAKA,EAAK,eACV,WAAYA,EAAK,qBACjB,GAAIA,EAAK,UACT,SAAUA,CACZ,GAMO,MAAMjB,UAAoC,oBAM/C,CACA,iBACEkB,EAOA,CASA,KAAM,CACJ,iBAAAC,EACA,aAAAC,EACA,sBAAAC,EACA,sBAAAC,EACA,oBAAAC,CACF,EAAI,KAAK,oBAAoBL,CAAW,EAElCM,EAAgB,KAAK,MAAM,eAAiB,4BAE5CC,EAA8BR,GAA+B,CACjE,MAAMS,EAAeL,EAAsB,EACrC,oBAAqBK,GAG3BJ,EAAsB,CACpB,GAAGI,EACH,gBAAiBV,EAA6BC,CAAI,EAClD,0BACEA,EAAK,mBAAmB,yBAC5B,CAAC,CACH,EAEMU,EAA8B,IAAM,CACxC,MAAMC,EAAQP,EAAsB,EACpC,GAAM,oBAAqBO,EAG3B,OAAOA,EAAM,iBAAiB,QAChC,EAEA,SAAO,SAAM,CACX,MAAO,CACL,MAAO,CACL,cAAAJ,CACF,EACA,QAAS,CAAC,EACV,OAAQ,CAAC,CACX,EACA,OAAQ,CACN,oBAAkB,eAAYL,CAAgB,EAC9C,gBAAc,eAAYC,CAAY,EACtC,uBAAqB,kBAAeG,CAAmB,CACzD,EACA,OAAQ,CACN,8BAA+B,IACZI,EAA4B,GAC5B,mBAAmB,cAAgB,GAEtD,iCAAkC,IAAM,CACtC,MAAME,EAAWF,EAA4B,EAC7C,OACEE,IAAa,QAAa,CAACA,EAAS,mBAAmB,WAE3D,EACA,oBAAqB,IAAMF,EAA4B,IAAM,OAC7D,yBAA0B,CAAC,CAAE,QAAAG,CAAQ,IACnCA,EAAQ,eAAe,mBAAmB,mBACvC,cAAgB,GACrB,eAAgB,CAAC,CAAE,QAAAA,CAAQ,IAAMA,EAAQ,eAAe,OACxD,SAAU,CAAC,CAAE,QAAAA,CAAQ,IAAMA,EAAQ,eAAe,QAAU,IAC9D,EACA,QAAS,CACP,iCAA+B,UAAO,CACpC,eAAiBC,IAAO,CACtB,GAAGA,EAAE,QAAQ,eACb,MAAO,IAAI,yBACb,EACF,CAAC,EACD,2BAAyB,UAAO,CAC9B,eAAiBA,IAAO,CACtB,GAAGA,EAAE,QAAQ,eACb,MAAO,IAAI,mBACb,GACA,kBAAmB,CACjB,wBAAyB,0BAAwB,aACjD,KAAM,6BAA2B,aACnC,CACF,CAAC,EACD,wBAAsB,UAAO,CAC3B,eAAiBA,IAAO,CACtB,GAAGA,EAAE,QAAQ,eACb,MAAOA,EAAE,MAAM,KACjB,EACF,CAAC,EACD,4BAA0B,UAAO,CAC/B,kBAAoBA,IACjB,CACC,GAAGA,EAAE,QAAQ,kBACb,wBAAyB,0BAAwB,IACnD,EACJ,CAAC,EACD,gCAA8B,UAAO,CACnC,kBAAoBA,IACjB,CACC,GAAGA,EAAE,QAAQ,kBACb,wBAAyB,0BAAwB,aACjD,KAAM,6BAA2B,aACnC,EACJ,CAAC,CACH,CACF,CAAC,EAAE,cAAc,CAEf,GAAI,8BACJ,QAAS,cACT,QAAUA,GAAM,CACd,MAAMC,EAAeX,EAAsB,EACrC,CAAE,iBAAAY,CAAiB,EAAID,EAC7B,MAAO,CACL,MAAO,CACL,cAAeD,EAAE,MAAM,aACzB,EACA,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,6BAA2B,aACnC,EACA,eAAgB,CACd,UAAW,GACX,OAAQ,GACR,WACEE,IACA,yBAAuB,0BACnBD,EAAa,WAAW,KACxB,KACN,kBAAmB,KACnB,kBAAmB,KACnB,MAAO,IACT,CACF,CACF,EACA,OAAQ,CACN,YAAa,CACX,OAAQ,CACN,OAAQ,iBACV,CACF,EACA,gBAAiB,CACf,OAAQ,CACN,CACE,MAAO,gCACP,OAAQ,qBACR,WAAS,UAAO,CACd,eAAiBD,IAAO,CACtB,GAAGA,EAAE,QAAQ,eACb,UAAW,EACb,EACF,CAAC,CACH,EACA,CACE,MAAO,mCACP,OAAQ,QACR,QAAS,+BACX,EACA,CACE,MAAO,sBACP,OAAQ,cACV,CACF,CACF,EACA,aAAc,CACZ,OAAQ,CACN,IAAK,eACL,OAAQ,CACN,OAAQ,wBACR,WAAS,UAAO,CACd,eAAiBA,MACX,0BAAuBA,EAAE,MAAM,MAAM,GACvCN,EAA2BM,EAAE,MAAM,OAAO,IAAI,EACvC,CACL,GAAGA,EAAE,QAAQ,eACb,kBAAmBA,EAAE,MAAM,OAAO,IACpC,GAEK,CACL,GAAGA,EAAE,QAAQ,eACb,MAAOA,EAAE,MAAM,OAAO,KACxB,CAEJ,CAAC,CACH,EACA,QAAS,CACP,OAAQ,QACR,QAAS,sBACX,CACF,CACF,EACA,sBAAuB,CACrB,OAAQ,CACN,CACE,MAAO,WACP,OAAQ,OACV,EACA,CACE,MAAO,2BACP,OAAQ,qBACR,WAAS,UAAO,CACd,eAAiBA,IAAO,CACtB,GAAGA,EAAE,QAAQ,eACb,UAAW,EACb,EACF,CAAC,CACH,EACA,CACE,OAAQ,QACR,QAAS,+BACX,CACF,CACF,EACA,uBAAwB,CAEtB,MAAO,+BACP,KAAM,2BACN,OAAQ,CACN,GAAI,yBACJ,IAAK,sBACL,MAAQA,IAAO,CACb,cAAAP,CACF,GACA,OAAQ,CACN,OAAQ,qBACR,WAAS,UAAO,CACd,eAAiBO,IAAO,CACtB,GAAGA,EAAE,QAAQ,eACb,OAAQ,EACV,EACF,CAAC,CACH,EACA,QAAS,CACP,OAAQ,QACR,QAAS,yBACX,CACF,CACF,EACA,mBAAoB,CAElB,OAAQ,CACN,IAAK,mBACL,OAAQ,CACN,OAAQ,kCACR,WAAS,UAAO,CACd,eAAiBA,GAAM,CACrB,MAAI,0BAAuBA,EAAE,MAAM,MAAM,EAAG,CAC1C,MAAMH,EAA4BP,EAAsB,EACxD,GACEO,EAAM,mBACN,yBAAuB,UAGvBN,EAAsB,CACpB,GAAGM,EACH,WAAYG,EAAE,MAAM,OAAO,IAC7B,CAAC,MACI,CACL,MAAMG,EACJH,EAAE,QAAQ,eAAe,kBAE3BT,EAAsB,CACpB,cAAeM,EAAM,cACrB,iBACE,yBAAuB,0BACzB,aAAc,eAAa,UAC3B,WAAYG,EAAE,MAAM,OAAO,KAC3B,cAAe,CAAC,EAChB,0BACEG,GAAmB,mBAChB,2BAA6B,GAClC,GAAIA,IAAsB,KACtB,CACE,gBACElB,EAA6BkB,CAAiB,CAClD,EACA,CAAC,CACP,CAAC,CACH,CACA,MAAO,CACL,GAAGH,EAAE,QAAQ,eACb,OAAQ,GACR,WAAYA,EAAE,MAAM,OAAO,KAAK,KAChC,kBAAmBA,EAAE,MAAM,OAAO,KAAK,OACzC,CACF,CACA,GAAI,cAAeA,EAAE,MAAM,OAAO,MAAO,CACvC,GAAIA,EAAE,MAAM,OAAO,MAAM,YAAc,OAErC,MAAO,CACL,GAAGA,EAAE,QAAQ,eACb,OAAQ,EACV,EACK,GAAIA,EAAE,MAAM,OAAO,MAAM,YAAc,OAQ5C,MAAO,CACL,GAAGA,EAAE,QAAQ,eACb,OAAQ,GACR,WAAY,QACZ,kBAAmB,OACrB,CAEJ,CACA,MAAO,CACL,GAAGA,EAAE,QAAQ,eACb,MAAOA,EAAE,MAAM,OAAO,KACxB,CACF,CACF,CAAC,CACH,EACA,QAAS,CACP,OAAQ,QACR,QAAS,sBACX,CACF,CACF,EACA,gCAAiC,CAC/B,OAAQ,CACN,CACE,MAAO,WACP,OAAQ,OACV,EACA,CACE,OAAQ,yBACR,MAAO,gBACT,EACA,CACE,OAAQ,SACV,CACF,CACF,EACA,QAAS,CACP,KAAM,OACR,EACA,MAAO,CACL,KAAM,OACR,CACF,EACA,OAASI,GAAS,CAEhB,KAAM,CAAE,QAAAL,CAAQ,EAAIK,EACd,CAAE,MAAAC,EAAO,WAAAC,EAAY,kBAAAC,CAAkB,EAAIR,EAAQ,eACzD,OAAIM,KACK,QAAKA,CAAK,KAEZ,SAA+B,CACpC,WAAYC,EACZ,kBAAmBC,CACrB,CAAC,CACH,CACF,CAAC,CACH,CAEA,oBAAoBpB,EAA+C,CA4BjE,MAAO,CACL,iBA5BuB,IAChBA,EAAY,YAAY,IAAI,yBAAyB,EA4B5D,aAAc,IAAMA,EAAY,YAAY,IAAI,qBAAqB,EACrE,oBA1B0B,CAAC,CAC3B,MAAAqB,CACF,OAGE,YAAS,GAAI,EAAE,QACb,aAAU,OACR,QAAKrB,EAAY,YAAY,IAAI,yBAAyB,CAAC,CAC7D,KACA,YAAUsB,GAEN,IAAC,0BAAuBA,CAAM,GAC9B,cAAeA,EAAO,OACtBA,EAAO,MAAM,YAAc,OAEpB,WAEF,MAAG,MAAS,CACpB,KACD,QAAK,CAAC,KACN,WAAQD,EAAM,aAAa,CAC7B,EAMA,sBAAuB,IAAMrB,EAAY,sBAAsB,EAC/D,sBAAwBU,GACtBV,EAAY,sBAAsBU,CAAK,CAC3C,CACF,CACF",
6
- "names": ["GetDeviceStatusDeviceAction_exports", "__export", "GetDeviceStatusDeviceAction", "__toCommonJS", "import_purify_ts", "import_rxjs", "import_operators", "import_xstate", "import_CommandResult", "import_GetAppAndVersionCommand", "import_GetOsVersionCommand", "import_DeviceStatus", "import_UserInteractionRequired", "import_Const", "import_Errors", "import_XStateDeviceAction", "import_DeviceSessionState", "import_types", "firmwareVersionFromOsVersion", "data", "internalApi", "getAppAndVersion", "getOsVersion", "getDeviceSessionState", "setDeviceSessionState", "waitForDeviceUnlock", "unlockTimeout", "updateSessionFromOsVersion", "currentState", "getCachedOnboardingMetadata", "state", "metadata", "context", "_", "sessionState", "sessionStateType", "osVersionMetadata", "args", "error", "currentApp", "currentAppVersion", "input", "output"]
4
+ "sourcesContent": ["import { Left, Right } from \"purify-ts\";\nimport {\n EMPTY,\n from,\n interval,\n mergeMap,\n type Observable,\n of,\n switchMap,\n take,\n} from \"rxjs\";\nimport { timeout } from \"rxjs/operators\";\nimport { assign, fromObservable, fromPromise, setup } from \"xstate\";\n\nimport { isSuccessCommandResult } from \"@api/command/model/CommandResult\";\nimport {\n GetAppAndVersionCommand,\n type GetAppAndVersionCommandResult,\n} from \"@api/command/os/GetAppAndVersionCommand\";\nimport {\n GetOsVersionCommand,\n type GetOsVersionCommandResult,\n type GetOsVersionResponse,\n} from \"@api/command/os/GetOsVersionCommand\";\nimport { DeviceStatus } from \"@api/device/DeviceStatus\";\nimport { type InternalApi } from \"@api/device-action/DeviceAction\";\nimport { UserInteractionRequired } from \"@api/device-action/model/UserInteractionRequired\";\nimport { DEFAULT_UNLOCK_TIMEOUT_MS } from \"@api/device-action/os/Const\";\nimport {\n DeviceLockedError,\n DeviceNotOnboardedError,\n} from \"@api/device-action/os/Errors\";\nimport { type StateMachineTypes } from \"@api/device-action/xstate-utils/StateMachineTypes\";\nimport {\n type DeviceActionStateMachine,\n XStateDeviceAction,\n} from \"@api/device-action/xstate-utils/XStateDeviceAction\";\nimport {\n type DeviceSessionState,\n DeviceSessionStateType,\n type FirmwareVersion,\n} from \"@api/device-session/DeviceSessionState\";\n\nimport {\n type GetDeviceStatusDAError,\n type GetDeviceStatusDAInput,\n type GetDeviceStatusDAIntermediateValue,\n type GetDeviceStatusDAOutput,\n getDeviceStatusDAStateStep,\n} from \"./types\";\n\ntype GetDeviceStatusMachineInternalState = {\n readonly onboarded: boolean;\n readonly locked: boolean;\n readonly currentApp: string | null;\n readonly currentAppVersion: string | null;\n readonly osVersionMetadata: GetOsVersionResponse | null;\n readonly error: GetDeviceStatusDAError | null;\n};\n\nexport type MachineDependencies = {\n readonly getAppAndVersion: () => Promise<GetAppAndVersionCommandResult>;\n readonly getOsVersion: () => Promise<GetOsVersionCommandResult>;\n readonly getDeviceSessionState: () => DeviceSessionState;\n readonly waitForDeviceUnlock: (args: {\n input: { unlockTimeout: number };\n }) => Observable<void>;\n readonly setDeviceSessionState: (\n state: DeviceSessionState,\n ) => DeviceSessionState;\n};\n\nconst firmwareVersionFromOsVersion = (\n data: GetOsVersionResponse,\n): FirmwareVersion => ({\n mcu: data.mcuSephVersion,\n bootloader: data.mcuBootloaderVersion,\n os: data.seVersion,\n metadata: data,\n});\n\nexport type ExtractMachineDependencies = (\n internalApi: InternalApi,\n) => MachineDependencies;\n\nexport class GetDeviceStatusDeviceAction extends XStateDeviceAction<\n GetDeviceStatusDAOutput,\n GetDeviceStatusDAInput,\n GetDeviceStatusDAError,\n GetDeviceStatusDAIntermediateValue,\n GetDeviceStatusMachineInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n GetDeviceStatusDAOutput,\n GetDeviceStatusDAInput,\n GetDeviceStatusDAError,\n GetDeviceStatusDAIntermediateValue,\n GetDeviceStatusMachineInternalState\n > {\n type types = StateMachineTypes<\n GetDeviceStatusDAOutput,\n GetDeviceStatusDAInput,\n GetDeviceStatusDAError,\n GetDeviceStatusDAIntermediateValue,\n GetDeviceStatusMachineInternalState\n >;\n\n const {\n getAppAndVersion,\n getOsVersion,\n getDeviceSessionState,\n setDeviceSessionState,\n waitForDeviceUnlock,\n } = this.extractDependencies(internalApi);\n\n const unlockTimeout = this.input.unlockTimeout ?? DEFAULT_UNLOCK_TIMEOUT_MS;\n\n const updateSessionFromOsVersion = (data: GetOsVersionResponse) => {\n const currentState = getDeviceSessionState();\n if (currentState.sessionStateType === DeviceSessionStateType.Connected) {\n return;\n }\n setDeviceSessionState({\n ...currentState,\n firmwareVersion: firmwareVersionFromOsVersion(data),\n isSecureConnectionAllowed:\n data.secureElementFlags.isSecureConnectionAllowed,\n });\n };\n\n return setup({\n types: {\n input: {\n unlockTimeout,\n } as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n getAppAndVersion: fromPromise(getAppAndVersion),\n getOsVersion: fromPromise(getOsVersion),\n waitForDeviceUnlock: fromObservable(waitForDeviceUnlock),\n },\n guards: {\n isCurrentAppBolos: ({ context }) =>\n context._internalState.currentApp === \"BOLOS\",\n isOnboardedFromOsVersion: ({ context }) =>\n context._internalState.osVersionMetadata?.secureElementFlags\n .isOnboarded === true,\n isDeviceLocked: ({ context }) => context._internalState.locked,\n hasError: ({ context }) => context._internalState.error !== null,\n },\n actions: {\n assignErrorDeviceNotOnboarded: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new DeviceNotOnboardedError(),\n }),\n }),\n assignErrorDeviceLocked: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new DeviceLockedError(),\n }),\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n step: getDeviceStatusDAStateStep.UNLOCK_DEVICE,\n },\n }),\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: _.event[\"error\"], // NOTE: it should never happen, the error is not typed anymore here\n }),\n }),\n assignNoUserActionNeeded: assign({\n intermediateValue: (_) =>\n ({\n ..._.context.intermediateValue,\n requiredUserInteraction: UserInteractionRequired.None,\n }) satisfies types[\"context\"][\"intermediateValue\"],\n }),\n assignUserActionUnlockNeeded: assign({\n intermediateValue: (_) =>\n ({\n ..._.context.intermediateValue,\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n step: getDeviceStatusDAStateStep.UNLOCK_DEVICE,\n }) satisfies types[\"context\"][\"intermediateValue\"],\n }),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QHEwBcAiYBuBLAxmAMpoCGaArrFnoQIL5q4D2AdgHQ0FgBKYpEAJ4BiANoAGALqJQAB2axcTNjJAAPRAFoArAHZx7AIwAmQ7oCcugMyHzANmMAWYwBoQgxI8vsAHOJM+VuLmVj5e2gC+EW6omDjcJORUXPSMLBwA8qwARsykAE4QuKxQAMIAFmD4ANZiUqryisqsqhoImo4O7OGhPj4h5n6Obh4IunZ2RoZ+ena6nYaGUTHoKcRklNTxqc3sWbkFRSUVVbWihtJIII1K6a1aVtoGTxOOjtbv84YjiObik7ofPM7GFDP9jNofMsQLE1olNmsGLsADLMGrFMqVGp1S5yBS3FRXNqaOzadjiHx2KyORbzcRBczmH4IbTOdjaabaKmdGy6XSRaIw1bbdZJLa0MBI9LsVHo45Ys4XBr45r3dps-n0ubaGxgx6PZlWULkkLBGmDCzGYzQ2Ei+HJEVStjsACqsDA+SdrBdrAANmjqmthBA2GB2MVsMxqmG3R6vT7-TU1hJcdcVXciYgglZycYQiYqRTQoZtMynDmbM4aW8rHYzD4BSs4hL7eLuF7Xe7PWk2AmA0GPflmPl2LJfeQAGbDgC2nbjPe9fv7IpTyqaGdAbXmxnZPkMNNM820VuZ+8M7Dsb3MznpwW31sFtpbGwdEo7dFksjorAgADUPYobAnNiIasGGEZRmGT4JC+bY7NKH5fj+-75IBrDAdUCAQfg5DpCmq5XDcqqZmMjgGDY-yGJeejjFRzJ2P47DZoEJb+Hyx42sKz5ioiC7sIh35-gB6QYcIg7DqO45oFO+SztBhCtrxuwCchwlAQqWGsJGOHNPh9SEemhKbogdLsIMTjmPuNF1nYZaOBW+5OPu9l1oCjZCs2ME8Y6fGIb6BC4WwdDYKQuDjtkvq8HAFC+mgokEXi65GeoiBguYZJOPSJa6Hm1hGsyuglkxxiUjYVjXlq7nyaKCI+cpn7+Tp6TBaF4WRXwsAxXFCpiEqBlJS0JFAo4vg+BCe55e8-QFUVVglVShjlWRtZ2FEgqsMwEBwKo1WKXVG5pgNaokmRZmQg4fyLHR7ieCNpjGPyx7aNo6UNo4nGeQpsFKdKax8AIoyJQSg3Ge0L07q9F3+Istk3Qg1IjUaZ7GNS-LlU4H1wt9+3OvseSFBiGFrsDx01mZ15mHooReFaVj0fZ5Jci5zissYIKY3a2NvnxsrVITCrE8RoMdDucxWgx1jpZCELDHDgKTC9jg6mNXKLDSHPcbV3O7LG3bNH2SYioLB3EmCI1-HuVL6Cj4hU6eNjsIVD3UrWfKXVCj5cV5Wvtr5n6CShaFE-1JMkWzPgXpCjh+Faw3Mjq5jdOlJhGvo-RzRr3uvr79VjgFzQtWFpARVFnWxcHQNCylCBm+eKPjJL4jWMEdNww4O46vSFVsfyD5Nlj3na9KRAUPghCwPAIdV20QIR7e-RzOYbNK98cN7ndgR-BSzgo+YmdfYPOfSgAovkQ75MbyVtItehmSrJgcijz2uHD+pmXyQSQnyVLs2tQA */\n id: \"GetDeviceStatusDeviceAction\",\n initial: \"DeviceReady\",\n context: (_) => {\n const sessionState = getDeviceSessionState();\n const { sessionStateType } = sessionState;\n return {\n input: {\n unlockTimeout: _.input.unlockTimeout,\n },\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n _internalState: {\n onboarded: false,\n locked: false,\n currentApp:\n sessionStateType ===\n DeviceSessionStateType.ReadyWithoutSecureChannel\n ? sessionState.currentApp.name\n : null,\n currentAppVersion: null,\n osVersionMetadata: null,\n error: null,\n },\n };\n },\n states: {\n DeviceReady: {\n always: {\n target: \"AppAndVersionCheck\",\n },\n },\n AppAndVersionCheck: {\n // We check the current app and version using the getAppAndVersion\n // command. This command is supported both on the dashboard (BOLOS)\n // and inside applications, so it is used to determine the currently\n // running app before deciding whether to read the OS version.\n invoke: {\n src: \"getAppAndVersion\",\n onDone: {\n target: \"ApplicationAvailableResultCheck\",\n actions: assign({\n _internalState: (_) => {\n if (isSuccessCommandResult(_.event.output)) {\n const state: DeviceSessionState = getDeviceSessionState();\n if (\n state.sessionStateType !==\n DeviceSessionStateType.Connected\n ) {\n // Update the current app\n setDeviceSessionState({\n ...state,\n currentApp: _.event.output.data,\n });\n } else {\n // The device can be set to Ready if GetAppAndVersionCommand was successful.\n // The firmware version and secure connection flag are enriched later from\n // the OS version, which can only be read on the dashboard.\n setDeviceSessionState({\n deviceModelId: state.deviceModelId,\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: _.event.output.data,\n installedApps: [],\n isSecureConnectionAllowed: false,\n });\n }\n return {\n ..._.context._internalState,\n locked: false,\n currentApp: _.event.output.data.name,\n currentAppVersion: _.event.output.data.version,\n };\n }\n if (\"errorCode\" in _.event.output.error) {\n if (_.event.output.error.errorCode === \"5515\") {\n // Locked device error\n return {\n ..._.context._internalState,\n locked: true,\n };\n } else if (_.event.output.error.errorCode === \"6e00\") {\n // CLA not supported\n // GetAppAndVersion should always be supported by the firmware or any app.\n // But on old firmware versions, that APDU was not supported in the dashboard.\n // On those firmwares, it fails with CLA_NOT_SUPPORTED in BOLOS, and INS_NOT_SUPPORTED\n // in applications. Therefore if CLA is not supported, we can consider we're on the\n // dashboard on an old firmware. We should therefore return that information to\n // ensure the user can still update his firmware and is not blocked at this step.\n return {\n ..._.context._internalState,\n locked: false,\n currentApp: \"BOLOS\",\n currentAppVersion: \"0.0.0\",\n };\n }\n }\n return {\n ..._.context._internalState,\n error: _.event.output.error,\n };\n },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ApplicationAvailableResultCheck: {\n always: [\n {\n guard: \"hasError\",\n target: \"Error\",\n },\n {\n target: \"UserActionUnlockDevice\",\n guard: \"isDeviceLocked\",\n },\n {\n target: \"OnboardingCheck\",\n },\n ],\n },\n OnboardingCheck: {\n always: [\n {\n // The OS version (and thus the onboarding flag) can only be read\n // on the dashboard. If we are inside an application, fetching it\n // would fail, so we only fetch it when the current app is BOLOS.\n guard: \"isCurrentAppBolos\",\n target: \"GetOsVersion\",\n },\n {\n // A non-BOLOS application can only run on an onboarded device, so\n // if an app is open we can safely consider the device onboarded\n // without reading the OS version.\n target: \"Success\",\n actions: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n onboarded: true,\n }),\n }),\n },\n ],\n },\n GetOsVersion: {\n invoke: {\n src: \"getOsVersion\",\n onDone: {\n target: \"OnboardingResultCheck\",\n actions: assign({\n _internalState: (_) => {\n if (isSuccessCommandResult(_.event.output)) {\n updateSessionFromOsVersion(_.event.output.data);\n return {\n ..._.context._internalState,\n osVersionMetadata: _.event.output.data,\n };\n }\n return {\n ..._.context._internalState,\n error: _.event.output.error,\n };\n },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n OnboardingResultCheck: {\n always: [\n {\n guard: \"hasError\",\n target: \"Error\",\n },\n {\n guard: \"isOnboardedFromOsVersion\",\n target: \"Success\",\n actions: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n onboarded: true,\n }),\n }),\n },\n {\n target: \"Error\",\n actions: \"assignErrorDeviceNotOnboarded\",\n },\n ],\n },\n UserActionUnlockDevice: {\n // we wait for the device to be unlocked (default timeout is 15s)\n entry: \"assignUserActionUnlockNeeded\",\n exit: \"assignNoUserActionNeeded\",\n invoke: {\n id: \"UserActionUnlockDevice\",\n src: \"waitForDeviceUnlock\",\n input: (_) => ({\n unlockTimeout,\n }),\n onDone: {\n target: \"AppAndVersionCheck\",\n actions: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n locked: false,\n }),\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorDeviceLocked\",\n },\n },\n },\n Success: {\n type: \"final\",\n },\n Error: {\n type: \"final\",\n },\n },\n output: (args) => {\n // TODO: instead we should rely on the current state (\"Success\" or \"Error\")\n const { context } = args;\n const { error, currentApp, currentAppVersion } = context._internalState;\n if (error) {\n return Left(error);\n }\n return Right<GetDeviceStatusDAOutput>({\n currentApp: currentApp!,\n currentAppVersion: currentAppVersion!,\n });\n },\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppAndVersion = () => {\n return internalApi.sendCommand(new GetAppAndVersionCommand());\n };\n\n const waitForDeviceUnlock = ({\n input,\n }: {\n input: { unlockTimeout: number };\n }) =>\n interval(1000).pipe(\n switchMap(() =>\n from(internalApi.sendCommand(new GetAppAndVersionCommand())),\n ),\n mergeMap((output) => {\n const isLocked =\n !isSuccessCommandResult(output) &&\n \"errorCode\" in output.error &&\n output.error.errorCode === \"5515\";\n if (isLocked) {\n return EMPTY; // Continue the polling\n }\n return of(undefined); // Complete the observable\n }),\n take(1),\n timeout(input.unlockTimeout),\n );\n\n return {\n getAppAndVersion,\n getOsVersion: () => internalApi.sendCommand(new GetOsVersionCommand()),\n waitForDeviceUnlock,\n getDeviceSessionState: () => internalApi.getDeviceSessionState(),\n setDeviceSessionState: (state: DeviceSessionState) =>\n internalApi.setDeviceSessionState(state),\n };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["GetDeviceStatusDeviceAction_exports", "__export", "GetDeviceStatusDeviceAction", "__toCommonJS", "import_purify_ts", "import_rxjs", "import_operators", "import_xstate", "import_CommandResult", "import_GetAppAndVersionCommand", "import_GetOsVersionCommand", "import_DeviceStatus", "import_UserInteractionRequired", "import_Const", "import_Errors", "import_XStateDeviceAction", "import_DeviceSessionState", "import_types", "firmwareVersionFromOsVersion", "data", "internalApi", "getAppAndVersion", "getOsVersion", "getDeviceSessionState", "setDeviceSessionState", "waitForDeviceUnlock", "unlockTimeout", "updateSessionFromOsVersion", "currentState", "context", "_", "sessionState", "sessionStateType", "state", "args", "error", "currentApp", "currentAppVersion", "input", "output"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var A=require("rxjs"),u=require("../../../command/model/CommandResult"),y=require("../../../command/os/__mocks__/GetOsVersionCommand"),m=require("../../../command/utils/GlobalCommandError"),l=require("../../../device/DeviceModel"),r=require("../../../device/DeviceStatus"),a=require("../../../device-action/__test-utils__/makeInternalApi"),d=require("../../../device-action/__test-utils__/testDeviceActionStates"),s=require("../../../device-action/model/DeviceActionState"),O=require("../../../device-action/model/UserInteractionRequired"),C=require("../../../device-action/os/Errors"),i=require("../../../device-session/DeviceSessionState"),p=require("./GetDeviceStatusDeviceAction"),V=require("./types");const E=(S={},R=l.DeviceModelId.NANO_X)=>(0,u.CommandResultFactory)({data:(0,y.getOsVersionCommandResponseMockBuilder)(R,S)}),T=()=>({intermediateValue:{requiredUserInteraction:O.UserInteractionRequired.None,step:V.getDeviceStatusDAStateStep.ONBOARD_CHECK},status:s.DeviceActionStatus.Pending}),v=()=>[T(),T()];describe("GetDeviceStatusDeviceAction",()=>{const S=vi.fn(),R=vi.fn(),D=vi.fn(),f=vi.fn(),g=vi.fn();function k(){return{getAppAndVersion:S,getOsVersion:R,getDeviceSessionState:D,waitForDeviceUnlock:f,setDeviceSessionState:g}}const{sendCommand:w,getDeviceSessionState:N,getDeviceSessionStateObservable:L}=(0,a.makeDeviceActionInternalApiMock)();beforeEach(()=>{vi.resetAllMocks(),R.mockResolvedValue(E())}),describe("without overriding `extractDependencies`",()=>{it("should run the device action with an unlocked device",()=>new Promise((n,o)=>{const e=new p.GetDeviceStatusDeviceAction({input:{unlockTimeout:500}});N.mockReturnValue({sessionStateType:i.DeviceSessionStateType.Connected,deviceStatus:r.DeviceStatus.CONNECTED,deviceModelId:l.DeviceModelId.NANO_X}),w.mockResolvedValueOnce(E()).mockResolvedValue((0,u.CommandResultFactory)({data:{name:"BOLOS",version:"1.0.0"}}));const t=[...v(),{output:{currentApp:"BOLOS",currentAppVersion:"1.0.0"},status:s.DeviceActionStatus.Completed}];(0,d.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:n,onError:o})})),it("should run the device action with a locked device",()=>new Promise((n,o)=>{const e=new p.GetDeviceStatusDeviceAction({input:{unlockTimeout:1500}});N.mockReturnValue({sessionStateType:i.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:r.DeviceStatus.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"},installedApps:[],deviceModelId:l.DeviceModelId.NANO_X,isSecureConnectionAllowed:!1}),w.mockResolvedValueOnce(E()).mockResolvedValueOnce((0,u.CommandResultFactory)({error:new m.GlobalCommandError({...m.GLOBAL_ERRORS[5515],errorCode:"5515"})})).mockResolvedValue((0,u.CommandResultFactory)({data:{name:"BOLOS",version:"1.0.0"}}));const t=[...v(),{intermediateValue:{requiredUserInteraction:O.UserInteractionRequired.UnlockDevice,step:V.getDeviceStatusDAStateStep.UNLOCK_DEVICE},status:s.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:O.UserInteractionRequired.None,step:V.getDeviceStatusDAStateStep.UNLOCK_DEVICE},status:s.DeviceActionStatus.Pending},{output:{currentApp:"BOLOS",currentAppVersion:"1.0.0"},status:s.DeviceActionStatus.Completed}];(0,d.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:n,onError:o})})),it("should timeout with a locked device",()=>new Promise((n,o)=>{const e=new p.GetDeviceStatusDeviceAction({input:{unlockTimeout:200}});N.mockReturnValue({sessionStateType:i.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:r.DeviceStatus.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"},installedApps:[],deviceModelId:l.DeviceModelId.NANO_X,isSecureConnectionAllowed:!1}),w.mockResolvedValueOnce(E()).mockResolvedValueOnce((0,u.CommandResultFactory)({error:new m.GlobalCommandError({...m.GLOBAL_ERRORS[5515],errorCode:"5515"})})).mockResolvedValue((0,u.CommandResultFactory)({data:{name:"BOLOS",version:"1.0.0"}}));const t=[...v(),{intermediateValue:{requiredUserInteraction:O.UserInteractionRequired.UnlockDevice,step:V.getDeviceStatusDAStateStep.UNLOCK_DEVICE},status:s.DeviceActionStatus.Pending},{error:new C.DeviceLockedError("Device locked."),status:s.DeviceActionStatus.Error}];(0,d.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:n,onError:o})})),it("should run the device action with an old firmware not supporting GetAppAndVersion",()=>new Promise((n,o)=>{const e=new p.GetDeviceStatusDeviceAction({input:{unlockTimeout:500}});N.mockReturnValue({sessionStateType:i.DeviceSessionStateType.Connected,deviceStatus:r.DeviceStatus.CONNECTED,deviceModelId:l.DeviceModelId.NANO_X}),w.mockResolvedValueOnce(E()).mockResolvedValue((0,u.CommandResultFactory)({error:new m.GlobalCommandError({...m.GLOBAL_ERRORS["6e00"],errorCode:"6e00"})}));const t=[...v(),{output:{currentApp:"BOLOS",currentAppVersion:"0.0.0"},status:s.DeviceActionStatus.Completed}];(0,d.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:n,onError:o})}))}),describe("success cases",()=>{it("should return the device status if the device is unlocked",()=>new Promise((n,o)=>{D.mockReturnValue({sessionStateType:i.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:r.DeviceStatus.CONNECTED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}}),S.mockResolvedValue((0,u.CommandResultFactory)({data:{name:"BOLOS",version:"1.0.0"}}));const e=new p.GetDeviceStatusDeviceAction({input:{unlockTimeout:void 0}});vi.spyOn(e,"extractDependencies").mockReturnValue(k());const t=[...v(),{status:s.DeviceActionStatus.Completed,output:{currentApp:"BOLOS",currentAppVersion:"1.0.0"}}];(0,d.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:()=>{expect(g).toHaveBeenCalledWith({sessionStateType:i.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:r.DeviceStatus.CONNECTED,currentApp:{name:"BOLOS",version:"1.0.0"}}),n()},onError:o})})),it("should return the device status and update session if the device is not ready",()=>new Promise((n,o)=>{D.mockReturnValue({sessionStateType:i.DeviceSessionStateType.Connected,deviceStatus:r.DeviceStatus.CONNECTED,deviceModelId:l.DeviceModelId.NANO_X}),S.mockResolvedValue((0,u.CommandResultFactory)({data:{name:"BOLOS",version:"1.0.0"}}));const e=new p.GetDeviceStatusDeviceAction({input:{unlockTimeout:void 0}});vi.spyOn(e,"extractDependencies").mockReturnValue(k());const t=(0,y.getOsVersionCommandResponseMockBuilder)(l.DeviceModelId.NANO_X),c=[...v(),{status:s.DeviceActionStatus.Completed,output:{currentApp:"BOLOS",currentAppVersion:"1.0.0"}}];(0,d.testDeviceActionStates)(e,c,(0,a.makeDeviceActionInternalApiMock)(),{onDone:()=>{expect(g).toHaveBeenCalledWith({deviceModelId:l.DeviceModelId.NANO_X,sessionStateType:i.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:r.DeviceStatus.CONNECTED,currentApp:{name:"BOLOS",version:"1.0.0"},installedApps:[],isSecureConnectionAllowed:t.secureElementFlags.isSecureConnectionAllowed,firmwareVersion:{mcu:t.mcuSephVersion,bootloader:t.mcuBootloaderVersion,os:t.seVersion,metadata:t}}),n()},onError:o})})),it("should return the device status if the device is locked and the user unlocks the device",()=>new Promise((n,o)=>{D.mockReturnValue({sessionStateType:i.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:r.DeviceStatus.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}}),S.mockResolvedValueOnce((0,u.CommandResultFactory)({error:new m.GlobalCommandError({...m.GLOBAL_ERRORS[5515],errorCode:"5515"})})).mockResolvedValueOnce((0,u.CommandResultFactory)({data:{name:"BOLOS",version:"1.0.0"}})),f.mockImplementation(()=>new A.Observable(c=>{const h=(0,A.interval)(50).subscribe({next:x=>{x>2?(c.next({sessionStateType:i.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:r.DeviceStatus.CONNECTED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}}),c.complete()):c.next({sessionStateType:i.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:r.DeviceStatus.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}})}});return()=>{h.unsubscribe()}}));const e=new p.GetDeviceStatusDeviceAction({input:{unlockTimeout:500}});vi.spyOn(e,"extractDependencies").mockReturnValue(k());const t=[...v(),{intermediateValue:{requiredUserInteraction:O.UserInteractionRequired.UnlockDevice,step:V.getDeviceStatusDAStateStep.UNLOCK_DEVICE},status:s.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:O.UserInteractionRequired.None,step:V.getDeviceStatusDAStateStep.UNLOCK_DEVICE},status:s.DeviceActionStatus.Pending},{status:s.DeviceActionStatus.Completed,output:{currentApp:"BOLOS",currentAppVersion:"1.0.0"}}];(0,d.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:n,onError:o})}))}),describe("errors cases",()=>{it("should end in an error if the device is not onboarded",()=>new Promise((n,o)=>{D.mockReturnValue({sessionStateType:i.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:r.DeviceStatus.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"},installedApps:[],deviceModelId:l.DeviceModelId.NANO_X,isSecureConnectionAllowed:!1}),R.mockResolvedValue(E({secureElementFlags:{...(0,y.getOsVersionCommandResponseMockBuilder)().secureElementFlags,isOnboarded:!1}}));const e=new p.GetDeviceStatusDeviceAction({input:{unlockTimeout:500}});vi.spyOn(e,"extractDependencies").mockReturnValue(k());const t=[T(),{error:new C.DeviceNotOnboardedError,status:s.DeviceActionStatus.Error}];(0,d.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:n,onError:o})})),it("should end in an error if cached metadata says the device is not onboarded",()=>new Promise((n,o)=>{const e=(0,y.getOsVersionCommandResponseMockBuilder)(l.DeviceModelId.NANO_X,{secureElementFlags:{...(0,y.getOsVersionCommandResponseMockBuilder)().secureElementFlags,isOnboarded:!1}});D.mockReturnValue({sessionStateType:i.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:r.DeviceStatus.CONNECTED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"},installedApps:[],deviceModelId:l.DeviceModelId.NANO_X,isSecureConnectionAllowed:!1,firmwareVersion:{mcu:e.mcuSephVersion,bootloader:e.mcuBootloaderVersion,os:e.seVersion,metadata:e}});const t=new p.GetDeviceStatusDeviceAction({input:{unlockTimeout:500}});vi.spyOn(t,"extractDependencies").mockReturnValue(k());const c=[{error:new C.DeviceNotOnboardedError,status:s.DeviceActionStatus.Error}];(0,d.testDeviceActionStates)(t,c,(0,a.makeDeviceActionInternalApiMock)(),{onDone:()=>{expect(R).not.toHaveBeenCalled(),n()},onError:o})})),it("should end in an error if the device is locked and the user does not unlock",()=>new Promise((n,o)=>{D.mockReturnValue({sessionStateType:i.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:r.DeviceStatus.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}}),S.mockResolvedValue((0,u.CommandResultFactory)({error:new m.GlobalCommandError({...m.GLOBAL_ERRORS[5515],errorCode:"5515"})})),L.mockImplementation(()=>new A.Observable(c=>{const h=(0,A.interval)(200).subscribe({next:()=>{c.next({sessionStateType:i.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:r.DeviceStatus.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"},installedApps:[],deviceModelId:l.DeviceModelId.NANO_X,isSecureConnectionAllowed:!1})}});return()=>{h.unsubscribe()}}));const e=new p.GetDeviceStatusDeviceAction({input:{unlockTimeout:500}});vi.spyOn(e,"extractDependencies").mockReturnValue(k());const t=[...v(),{intermediateValue:{requiredUserInteraction:O.UserInteractionRequired.UnlockDevice,step:V.getDeviceStatusDAStateStep.UNLOCK_DEVICE},status:s.DeviceActionStatus.Pending},{error:new C.DeviceLockedError("Device locked."),status:s.DeviceActionStatus.Error}];(0,d.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:n,onError:o})})),it("should end in an error if the GetAppAndVersion command fails",()=>new Promise((n,o)=>{D.mockReturnValue({sessionStateType:i.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:r.DeviceStatus.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}});const e=new m.GlobalCommandError({...m.GLOBAL_ERRORS[5501],errorCode:"5501"});S.mockResolvedValue((0,u.CommandResultFactory)({error:e})),f.mockImplementation(()=>new A.Observable(h=>{const x=(0,A.interval)(50).subscribe({next:b=>{b>2?(h.next({sessionStateType:i.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:r.DeviceStatus.CONNECTED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}}),h.complete()):h.next({sessionStateType:i.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:r.DeviceStatus.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}})}});return()=>{x.unsubscribe()}}));const t=new p.GetDeviceStatusDeviceAction({input:{unlockTimeout:500}});vi.spyOn(t,"extractDependencies").mockReturnValue(k());const c=[...v(),{error:e,status:s.DeviceActionStatus.Error}];(0,d.testDeviceActionStates)(t,c,(0,a.makeDeviceActionInternalApiMock)(),{onDone:n,onError:o})})),it("should end in an error if getAppAndVersion actor throws an error",()=>new Promise((n,o)=>{D.mockReturnValue({sessionStateType:i.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:r.DeviceStatus.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}}),S.mockImplementation(()=>{throw new C.UnknownDAError("error")}),f.mockImplementation(()=>new A.Observable(c=>{c.complete()}));const e=new p.GetDeviceStatusDeviceAction({input:{unlockTimeout:500}});vi.spyOn(e,"extractDependencies").mockReturnValue(k());const t=[...v(),{error:new C.UnknownDAError("error"),status:s.DeviceActionStatus.Error}];(0,d.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:n,onError:o})}))}),it("should emit a stopped state if the action is cancelled",()=>new Promise((n,o)=>{N.mockReturnValue({sessionStateType:i.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:r.DeviceStatus.CONNECTED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"},installedApps:[],deviceModelId:l.DeviceModelId.NANO_X,isSecureConnectionAllowed:!1}),w.mockResolvedValueOnce(E()).mockResolvedValue((0,u.CommandResultFactory)({data:{name:"BOLOS",version:"1.0.0"}}));const e=new p.GetDeviceStatusDeviceAction({input:{unlockTimeout:500}}),t=[T(),{status:s.DeviceActionStatus.Stopped}],{cancel:c}=(0,d.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:n,onError:o});c()}))});
1
+ "use strict";var D=require("rxjs"),E=require("../../../command/model/CommandResult"),x=require("../../../command/os/__mocks__/GetOsVersionCommand"),h=require("../../../command/utils/GlobalCommandError"),l=require("../../../device/DeviceModel"),i=require("../../../device/DeviceStatus"),a=require("../../../device-action/__test-utils__/makeInternalApi"),u=require("../../../device-action/__test-utils__/testDeviceActionStates"),c=require("../../../device-action/model/DeviceActionState"),L=require("../../../device-action/model/UserInteractionRequired"),A=require("../../../device-action/os/Errors"),s=require("../../../device-session/DeviceSessionState"),d=require("./GetDeviceStatusDeviceAction"),G=require("./types");const V=(p={},k=l.DeviceModelId.NANO_X)=>(0,E.CommandResultFactory)({data:(0,x.getOsVersionCommandResponseMockBuilder)(k,p)}),C=(p,k)=>(0,E.CommandResultFactory)({data:{name:p,version:k}}),T=()=>(0,E.CommandResultFactory)({error:new h.GlobalCommandError({...h.GLOBAL_ERRORS[5515],errorCode:"5515"})}),v=()=>({intermediateValue:{requiredUserInteraction:L.UserInteractionRequired.None,step:G.getDeviceStatusDAStateStep.ONBOARD_CHECK},status:c.DeviceActionStatus.Pending}),N=()=>[v(),v()],I=()=>({intermediateValue:{requiredUserInteraction:L.UserInteractionRequired.UnlockDevice,step:G.getDeviceStatusDAStateStep.UNLOCK_DEVICE},status:c.DeviceActionStatus.Pending}),P=()=>({intermediateValue:{requiredUserInteraction:L.UserInteractionRequired.None,step:G.getDeviceStatusDAStateStep.UNLOCK_DEVICE},status:c.DeviceActionStatus.Pending});describe("GetDeviceStatusDeviceAction",()=>{const p=vi.fn(),k=vi.fn(),S=vi.fn(),w=vi.fn(),f=vi.fn();function O(){return{getAppAndVersion:p,getOsVersion:k,getDeviceSessionState:S,waitForDeviceUnlock:w,setDeviceSessionState:f}}const{sendCommand:y,getDeviceSessionState:R,getDeviceSessionStateObservable:b}=(0,a.makeDeviceActionInternalApiMock)();beforeEach(()=>{vi.resetAllMocks(),k.mockResolvedValue(V())}),describe("without overriding `extractDependencies`",()=>{it("should run the device action with an unlocked device",()=>new Promise((o,r)=>{const e=new d.GetDeviceStatusDeviceAction({input:{unlockTimeout:500}});R.mockReturnValue({sessionStateType:s.DeviceSessionStateType.Connected,deviceStatus:i.DeviceStatus.CONNECTED,deviceModelId:l.DeviceModelId.NANO_X}),y.mockImplementation(n=>n.name==="getOsVersion"?Promise.resolve(V()):Promise.resolve(C("BOLOS","1.0.0")));const t=[...N(),{output:{currentApp:"BOLOS",currentAppVersion:"1.0.0"},status:c.DeviceActionStatus.Completed}];(0,u.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:o,onError:r})})),it("should run the device action with a locked device",()=>new Promise((o,r)=>{const e=new d.GetDeviceStatusDeviceAction({input:{unlockTimeout:1500}});R.mockReturnValue({sessionStateType:s.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:i.DeviceStatus.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"},installedApps:[],deviceModelId:l.DeviceModelId.NANO_X,isSecureConnectionAllowed:!1});let t=0;y.mockImplementation(m=>m.name==="getOsVersion"?Promise.resolve(V()):(t+=1,t===1?Promise.resolve(T()):Promise.resolve(C("BOLOS","1.0.0"))));const n=[v(),I(),P(),P(),{output:{currentApp:"BOLOS",currentAppVersion:"1.0.0"},status:c.DeviceActionStatus.Completed}];(0,u.testDeviceActionStates)(e,n,(0,a.makeDeviceActionInternalApiMock)(),{onDone:o,onError:r})})),it("should timeout with a locked device",()=>new Promise((o,r)=>{const e=new d.GetDeviceStatusDeviceAction({input:{unlockTimeout:200}});R.mockReturnValue({sessionStateType:s.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:i.DeviceStatus.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"},installedApps:[],deviceModelId:l.DeviceModelId.NANO_X,isSecureConnectionAllowed:!1}),y.mockImplementation(n=>n.name==="getOsVersion"?Promise.resolve(V()):Promise.resolve(T()));const t=[v(),I(),{error:new A.DeviceLockedError("Device locked."),status:c.DeviceActionStatus.Error}];(0,u.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:o,onError:r})})),it("should run the device action with an old firmware not supporting GetAppAndVersion",()=>new Promise((o,r)=>{const e=new d.GetDeviceStatusDeviceAction({input:{unlockTimeout:500}});R.mockReturnValue({sessionStateType:s.DeviceSessionStateType.Connected,deviceStatus:i.DeviceStatus.CONNECTED,deviceModelId:l.DeviceModelId.NANO_X}),y.mockImplementation(n=>n.name==="getOsVersion"?Promise.resolve(V()):Promise.resolve((0,E.CommandResultFactory)({error:new h.GlobalCommandError({...h.GLOBAL_ERRORS["6e00"],errorCode:"6e00"})})));const t=[...N(),{output:{currentApp:"BOLOS",currentAppVersion:"0.0.0"},status:c.DeviceActionStatus.Completed}];(0,u.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:o,onError:r})}))}),describe("success cases",()=>{it("should return the device status if the device is unlocked",()=>new Promise((o,r)=>{S.mockReturnValue({sessionStateType:s.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:i.DeviceStatus.CONNECTED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}}),p.mockResolvedValue(C("BOLOS","1.0.0"));const e=new d.GetDeviceStatusDeviceAction({input:{unlockTimeout:void 0}});vi.spyOn(e,"extractDependencies").mockReturnValue(O());const t=[...N(),{status:c.DeviceActionStatus.Completed,output:{currentApp:"BOLOS",currentAppVersion:"1.0.0"}}];(0,u.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:()=>{expect(f).toHaveBeenCalledWith({sessionStateType:s.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:i.DeviceStatus.CONNECTED,currentApp:{name:"BOLOS",version:"1.0.0"}}),o()},onError:r})})),it("should return the device status and update session if the device is not ready",()=>new Promise((o,r)=>{let e={sessionStateType:s.DeviceSessionStateType.Connected,deviceStatus:i.DeviceStatus.CONNECTED,deviceModelId:l.DeviceModelId.NANO_X};S.mockImplementation(()=>e),f.mockImplementation(g=>(e=g,g)),p.mockResolvedValue(C("BOLOS","1.0.0"));const t=new d.GetDeviceStatusDeviceAction({input:{unlockTimeout:void 0}});vi.spyOn(t,"extractDependencies").mockReturnValue(O());const n=(0,x.getOsVersionCommandResponseMockBuilder)(l.DeviceModelId.NANO_X),m=[...N(),{status:c.DeviceActionStatus.Completed,output:{currentApp:"BOLOS",currentAppVersion:"1.0.0"}}];(0,u.testDeviceActionStates)(t,m,(0,a.makeDeviceActionInternalApiMock)(),{onDone:()=>{expect(f).toHaveBeenCalledWith({deviceModelId:l.DeviceModelId.NANO_X,sessionStateType:s.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:i.DeviceStatus.CONNECTED,currentApp:{name:"BOLOS",version:"1.0.0"},installedApps:[],isSecureConnectionAllowed:n.secureElementFlags.isSecureConnectionAllowed,firmwareVersion:{mcu:n.mcuSephVersion,bootloader:n.mcuBootloaderVersion,os:n.seVersion,metadata:n}}),o()},onError:r})})),it("should not fetch the OS version when an app other than BOLOS is open",()=>new Promise((o,r)=>{S.mockReturnValue({sessionStateType:s.DeviceSessionStateType.Connected,deviceStatus:i.DeviceStatus.CONNECTED,deviceModelId:l.DeviceModelId.NANO_X}),p.mockResolvedValue(C("Bitcoin","2.1.0"));const e=new d.GetDeviceStatusDeviceAction({input:{unlockTimeout:void 0}});vi.spyOn(e,"extractDependencies").mockReturnValue(O());const t=[v(),{status:c.DeviceActionStatus.Completed,output:{currentApp:"Bitcoin",currentAppVersion:"2.1.0"}}];(0,u.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:()=>{expect(k).not.toHaveBeenCalled(),o()},onError:r})})),it("should return the device status if the device is locked and the user unlocks the device",()=>new Promise((o,r)=>{S.mockReturnValue({sessionStateType:s.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:i.DeviceStatus.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}}),p.mockResolvedValueOnce(T()).mockResolvedValueOnce(C("BOLOS","1.0.0")),w.mockImplementation(()=>new D.Observable(n=>{const m=(0,D.interval)(50).subscribe({next:g=>{g>2?(n.next({sessionStateType:s.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:i.DeviceStatus.CONNECTED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}}),n.complete()):n.next({sessionStateType:s.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:i.DeviceStatus.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}})}});return()=>{m.unsubscribe()}}));const e=new d.GetDeviceStatusDeviceAction({input:{unlockTimeout:500}});vi.spyOn(e,"extractDependencies").mockReturnValue(O());const t=[v(),I(),P(),P(),{status:c.DeviceActionStatus.Completed,output:{currentApp:"BOLOS",currentAppVersion:"1.0.0"}}];(0,u.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:o,onError:r})}))}),describe("errors cases",()=>{it("should end in an error if the device is not onboarded",()=>new Promise((o,r)=>{S.mockReturnValue({sessionStateType:s.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:i.DeviceStatus.CONNECTED,currentApp:{name:"BOLOS",version:"1.0.0"},installedApps:[],deviceModelId:l.DeviceModelId.NANO_X,isSecureConnectionAllowed:!1}),p.mockResolvedValue(C("BOLOS","1.0.0")),k.mockResolvedValue(V({secureElementFlags:{...(0,x.getOsVersionCommandResponseMockBuilder)().secureElementFlags,isOnboarded:!1}}));const e=new d.GetDeviceStatusDeviceAction({input:{unlockTimeout:500}});vi.spyOn(e,"extractDependencies").mockReturnValue(O());const t=[...N(),{error:new A.DeviceNotOnboardedError,status:c.DeviceActionStatus.Error}];(0,u.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:o,onError:r})})),it("should end in an error if the device is locked and the user does not unlock",()=>new Promise((o,r)=>{S.mockReturnValue({sessionStateType:s.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:i.DeviceStatus.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}}),p.mockResolvedValue(T()),w.mockImplementation(()=>new D.Observable(n=>{n.error(new A.DeviceLockedError("Device locked."))})),b.mockImplementation(()=>new D.Observable(n=>{const m=(0,D.interval)(200).subscribe({next:()=>{n.next({sessionStateType:s.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:i.DeviceStatus.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"},installedApps:[],deviceModelId:l.DeviceModelId.NANO_X,isSecureConnectionAllowed:!1})}});return()=>{m.unsubscribe()}}));const e=new d.GetDeviceStatusDeviceAction({input:{unlockTimeout:500}});vi.spyOn(e,"extractDependencies").mockReturnValue(O());const t=[v(),I(),{error:new A.DeviceLockedError("Device locked."),status:c.DeviceActionStatus.Error}];(0,u.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:o,onError:r})})),it("should end in an error if the GetAppAndVersion command fails",()=>new Promise((o,r)=>{S.mockReturnValue({sessionStateType:s.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:i.DeviceStatus.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}});const e=new h.GlobalCommandError({...h.GLOBAL_ERRORS[5501],errorCode:"5501"});p.mockResolvedValue((0,E.CommandResultFactory)({error:e})),w.mockImplementation(()=>new D.Observable(m=>{m.complete()}));const t=new d.GetDeviceStatusDeviceAction({input:{unlockTimeout:500}});vi.spyOn(t,"extractDependencies").mockReturnValue(O());const n=[v(),{error:e,status:c.DeviceActionStatus.Error}];(0,u.testDeviceActionStates)(t,n,(0,a.makeDeviceActionInternalApiMock)(),{onDone:o,onError:r})})),it("should end in an error if getAppAndVersion actor throws an error",()=>new Promise((o,r)=>{S.mockReturnValue({sessionStateType:s.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:i.DeviceStatus.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}}),p.mockImplementation(()=>{throw new A.UnknownDAError("error")}),w.mockImplementation(()=>new D.Observable(n=>{n.complete()}));const e=new d.GetDeviceStatusDeviceAction({input:{unlockTimeout:500}});vi.spyOn(e,"extractDependencies").mockReturnValue(O());const t=[v(),{error:new A.UnknownDAError("error"),status:c.DeviceActionStatus.Error}];(0,u.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:o,onError:r})}))}),it("should emit a stopped state if the action is cancelled",()=>new Promise((o,r)=>{R.mockReturnValue({sessionStateType:s.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:i.DeviceStatus.CONNECTED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"},installedApps:[],deviceModelId:l.DeviceModelId.NANO_X,isSecureConnectionAllowed:!1}),y.mockImplementation(m=>m.name==="getOsVersion"?Promise.resolve(V()):Promise.resolve(C("BOLOS","1.0.0")));const e=new d.GetDeviceStatusDeviceAction({input:{unlockTimeout:500}}),t=[v(),{status:c.DeviceActionStatus.Stopped}],{cancel:n}=(0,u.testDeviceActionStates)(e,t,(0,a.makeDeviceActionInternalApiMock)(),{onDone:o,onError:r});n()}))});
2
2
  //# sourceMappingURL=GetDeviceStatusDeviceAction.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.test.ts"],
4
- "sourcesContent": ["import { interval, Observable } from \"rxjs\";\n\nimport { CommandResultFactory } from \"@api/command/model/CommandResult\";\nimport { getOsVersionCommandResponseMockBuilder } from \"@api/command/os/__mocks__/GetOsVersionCommand\";\nimport { type GetOsVersionResponse } from \"@api/command/os/GetOsVersionCommand\";\nimport {\n GLOBAL_ERRORS,\n GlobalCommandError,\n} from \"@api/command/utils/GlobalCommandError\";\nimport { DeviceModelId } from \"@api/device/DeviceModel\";\nimport { DeviceStatus } from \"@api/device/DeviceStatus\";\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { testDeviceActionStates } from \"@api/device-action/__test-utils__/testDeviceActionStates\";\nimport { DeviceActionStatus } from \"@api/device-action/model/DeviceActionState\";\nimport { UserInteractionRequired } from \"@api/device-action/model/UserInteractionRequired\";\nimport {\n DeviceLockedError,\n DeviceNotOnboardedError,\n UnknownDAError,\n} from \"@api/device-action/os/Errors\";\nimport { DeviceSessionStateType } from \"@api/device-session/DeviceSessionState\";\n\nimport { GetDeviceStatusDeviceAction } from \"./GetDeviceStatusDeviceAction\";\nimport {\n type GetDeviceStatusDAState,\n getDeviceStatusDAStateStep,\n} from \"./types\";\n\nconst osVersionCommandResult = (\n props: Partial<GetOsVersionResponse> = {},\n deviceModelId: DeviceModelId = DeviceModelId.NANO_X,\n) =>\n CommandResultFactory({\n data: getOsVersionCommandResponseMockBuilder(deviceModelId, props),\n });\n\nconst onboardCheckPendingState = (): GetDeviceStatusDAState => ({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n status: DeviceActionStatus.Pending,\n});\n\nconst onboardCheckPendingStatesWithOsVersionFetch =\n (): Array<GetDeviceStatusDAState> => [\n onboardCheckPendingState(),\n onboardCheckPendingState(),\n ];\n\ndescribe(\"GetDeviceStatusDeviceAction\", () => {\n const getAppAndVersionMock = vi.fn();\n const getOsVersionMock = vi.fn();\n const getDeviceSessionStateMock = vi.fn();\n const waitForDeviceUnlockMock = vi.fn();\n const setDeviceSessionState = vi.fn();\n\n function extractDependenciesMock() {\n return {\n getAppAndVersion: getAppAndVersionMock,\n getOsVersion: getOsVersionMock,\n getDeviceSessionState: getDeviceSessionStateMock,\n waitForDeviceUnlock: waitForDeviceUnlockMock,\n setDeviceSessionState: setDeviceSessionState,\n };\n }\n\n const {\n sendCommand: sendCommandMock,\n getDeviceSessionState: apiGetDeviceSessionStateMock,\n getDeviceSessionStateObservable: apiGetDeviceSessionStateObservableMock,\n } = makeDeviceActionInternalApiMock();\n beforeEach(() => {\n vi.resetAllMocks();\n getOsVersionMock.mockResolvedValue(osVersionCommandResult());\n });\n\n describe(\"without overriding `extractDependencies`\", () => {\n it(\"should run the device action with an unlocked device\", () =>\n new Promise<void>((resolve, reject) => {\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n apiGetDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n deviceModelId: DeviceModelId.NANO_X,\n });\n\n sendCommandMock\n .mockResolvedValueOnce(osVersionCommandResult())\n .mockResolvedValue(\n CommandResultFactory({\n data: {\n name: \"BOLOS\",\n version: \"1.0.0\",\n },\n }),\n );\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n ...onboardCheckPendingStatesWithOsVersionFetch(),\n {\n output: {\n currentApp: \"BOLOS\",\n currentAppVersion: \"1.0.0\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should run the device action with a locked device\", () =>\n new Promise<void>((resolve, reject) => {\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 1500 },\n });\n\n apiGetDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.LOCKED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n installedApps: [],\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: false,\n });\n\n sendCommandMock\n .mockResolvedValueOnce(osVersionCommandResult())\n .mockResolvedValueOnce(\n CommandResultFactory({\n error: new GlobalCommandError({\n ...GLOBAL_ERRORS[\"5515\"],\n errorCode: \"5515\",\n }),\n }),\n )\n .mockResolvedValue(\n CommandResultFactory({\n data: {\n name: \"BOLOS\",\n version: \"1.0.0\",\n },\n }),\n );\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n ...onboardCheckPendingStatesWithOsVersionFetch(),\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n step: getDeviceStatusDAStateStep.UNLOCK_DEVICE,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.UNLOCK_DEVICE,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n currentApp: \"BOLOS\",\n currentAppVersion: \"1.0.0\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should timeout with a locked device\", () =>\n new Promise<void>((resolve, reject) => {\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 200 },\n });\n\n apiGetDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.LOCKED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n installedApps: [],\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: false,\n });\n\n sendCommandMock\n .mockResolvedValueOnce(osVersionCommandResult())\n .mockResolvedValueOnce(\n CommandResultFactory({\n error: new GlobalCommandError({\n ...GLOBAL_ERRORS[\"5515\"],\n errorCode: \"5515\",\n }),\n }),\n )\n .mockResolvedValue(\n CommandResultFactory({\n data: {\n name: \"BOLOS\",\n version: \"1.0.0\",\n },\n }),\n );\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n ...onboardCheckPendingStatesWithOsVersionFetch(),\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n step: getDeviceStatusDAStateStep.UNLOCK_DEVICE,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new DeviceLockedError(\"Device locked.\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should run the device action with an old firmware not supporting GetAppAndVersion\", () =>\n new Promise<void>((resolve, reject) => {\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n apiGetDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n deviceModelId: DeviceModelId.NANO_X,\n });\n\n sendCommandMock\n .mockResolvedValueOnce(osVersionCommandResult())\n .mockResolvedValue(\n CommandResultFactory({\n error: new GlobalCommandError({\n ...GLOBAL_ERRORS[\"6e00\"],\n errorCode: \"6e00\",\n }),\n }),\n );\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n ...onboardCheckPendingStatesWithOsVersionFetch(),\n {\n output: {\n currentApp: \"BOLOS\",\n currentAppVersion: \"0.0.0\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n });\n\n describe(\"success cases\", () => {\n it(\"should return the device status if the device is unlocked\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n });\n\n getAppAndVersionMock.mockResolvedValue(\n CommandResultFactory({\n data: {\n name: \"BOLOS\",\n version: \"1.0.0\",\n },\n }),\n );\n\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: undefined },\n });\n\n vi.spyOn(\n getDeviceStateDeviceAction,\n \"extractDependencies\",\n ).mockReturnValue(extractDependenciesMock());\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n ...onboardCheckPendingStatesWithOsVersionFetch(),\n {\n status: DeviceActionStatus.Completed,\n output: {\n currentApp: \"BOLOS\",\n currentAppVersion: \"1.0.0\",\n },\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: () => {\n // Session should be updated with current app\n expect(setDeviceSessionState).toHaveBeenCalledWith({\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: {\n name: \"BOLOS\",\n version: \"1.0.0\",\n },\n });\n resolve();\n },\n onError: reject,\n },\n );\n }));\n\n it(\"should return the device status and update session if the device is not ready\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n deviceModelId: DeviceModelId.NANO_X,\n });\n\n getAppAndVersionMock.mockResolvedValue(\n CommandResultFactory({\n data: {\n name: \"BOLOS\",\n version: \"1.0.0\",\n },\n }),\n );\n\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: undefined },\n });\n\n vi.spyOn(\n getDeviceStateDeviceAction,\n \"extractDependencies\",\n ).mockReturnValue(extractDependenciesMock());\n\n const osVersionData = getOsVersionCommandResponseMockBuilder(\n DeviceModelId.NANO_X,\n );\n const expectedStates: Array<GetDeviceStatusDAState> = [\n ...onboardCheckPendingStatesWithOsVersionFetch(),\n {\n status: DeviceActionStatus.Completed,\n output: {\n currentApp: \"BOLOS\",\n currentAppVersion: \"1.0.0\",\n },\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: () => {\n // Session should be set as ready if GetAppAndVersionCommand was successful\n expect(setDeviceSessionState).toHaveBeenCalledWith({\n deviceModelId: DeviceModelId.NANO_X,\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: {\n name: \"BOLOS\",\n version: \"1.0.0\",\n },\n installedApps: [],\n isSecureConnectionAllowed:\n osVersionData.secureElementFlags.isSecureConnectionAllowed,\n firmwareVersion: {\n mcu: osVersionData.mcuSephVersion,\n bootloader: osVersionData.mcuBootloaderVersion,\n os: osVersionData.seVersion,\n metadata: osVersionData,\n },\n });\n resolve();\n },\n onError: reject,\n },\n );\n }));\n\n it(\"should return the device status if the device is locked and the user unlocks the device\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.LOCKED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n });\n\n getAppAndVersionMock\n .mockResolvedValueOnce(\n CommandResultFactory({\n error: new GlobalCommandError({\n ...GLOBAL_ERRORS[\"5515\"],\n errorCode: \"5515\",\n }),\n }),\n )\n .mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n name: \"BOLOS\",\n version: \"1.0.0\",\n },\n }),\n );\n\n waitForDeviceUnlockMock.mockImplementation(\n () =>\n new Observable((o) => {\n const inner = interval(50).subscribe({\n next: (i) => {\n if (i > 2) {\n o.next({\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: {\n name: \"mockedCurrentApp\",\n version: \"1.0.0\",\n },\n });\n o.complete();\n } else {\n o.next({\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.LOCKED,\n currentApp: {\n name: \"mockedCurrentApp\",\n version: \"1.0.0\",\n },\n });\n }\n },\n });\n\n return () => {\n inner.unsubscribe();\n };\n }),\n );\n\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n vi.spyOn(\n getDeviceStateDeviceAction,\n \"extractDependencies\",\n ).mockReturnValue(extractDependenciesMock());\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n ...onboardCheckPendingStatesWithOsVersionFetch(),\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n step: getDeviceStatusDAStateStep.UNLOCK_DEVICE,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.UNLOCK_DEVICE,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n status: DeviceActionStatus.Completed,\n output: {\n currentApp: \"BOLOS\",\n currentAppVersion: \"1.0.0\",\n },\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n });\n\n describe(\"errors cases\", () => {\n it(\"should end in an error if the device is not onboarded\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.LOCKED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n installedApps: [],\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: false,\n });\n getOsVersionMock.mockResolvedValue(\n osVersionCommandResult({\n secureElementFlags: {\n ...getOsVersionCommandResponseMockBuilder().secureElementFlags,\n isOnboarded: false,\n },\n }),\n );\n\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n vi.spyOn(\n getDeviceStateDeviceAction,\n \"extractDependencies\",\n ).mockReturnValue(extractDependenciesMock());\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n onboardCheckPendingState(),\n {\n error: new DeviceNotOnboardedError(),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in an error if cached metadata says the device is not onboarded\", () =>\n new Promise<void>((resolve, reject) => {\n const osVersionData = getOsVersionCommandResponseMockBuilder(\n DeviceModelId.NANO_X,\n {\n secureElementFlags: {\n ...getOsVersionCommandResponseMockBuilder().secureElementFlags,\n isOnboarded: false,\n },\n },\n );\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n installedApps: [],\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: false,\n firmwareVersion: {\n mcu: osVersionData.mcuSephVersion,\n bootloader: osVersionData.mcuBootloaderVersion,\n os: osVersionData.seVersion,\n metadata: osVersionData,\n },\n });\n\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n vi.spyOn(\n getDeviceStateDeviceAction,\n \"extractDependencies\",\n ).mockReturnValue(extractDependenciesMock());\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n {\n error: new DeviceNotOnboardedError(),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: () => {\n expect(getOsVersionMock).not.toHaveBeenCalled();\n resolve();\n },\n onError: reject,\n },\n );\n }));\n\n it(\"should end in an error if the device is locked and the user does not unlock\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.LOCKED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n });\n\n getAppAndVersionMock.mockResolvedValue(\n CommandResultFactory({\n error: new GlobalCommandError({\n ...GLOBAL_ERRORS[\"5515\"],\n errorCode: \"5515\",\n }),\n }),\n );\n\n apiGetDeviceSessionStateObservableMock.mockImplementation(\n () =>\n new Observable((o) => {\n const inner = interval(200).subscribe({\n next: () => {\n o.next({\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.LOCKED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n installedApps: [],\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: false,\n });\n },\n });\n\n return () => {\n inner.unsubscribe();\n };\n }),\n );\n\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n vi.spyOn(\n getDeviceStateDeviceAction,\n \"extractDependencies\",\n ).mockReturnValue(extractDependenciesMock());\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n ...onboardCheckPendingStatesWithOsVersionFetch(),\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n step: getDeviceStatusDAStateStep.UNLOCK_DEVICE,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new DeviceLockedError(\"Device locked.\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in an error if the GetAppAndVersion command fails\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.LOCKED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n });\n\n const error = new GlobalCommandError({\n ...GLOBAL_ERRORS[\"5501\"],\n errorCode: \"5501\",\n });\n\n getAppAndVersionMock.mockResolvedValue(CommandResultFactory({ error }));\n\n waitForDeviceUnlockMock.mockImplementation(\n () =>\n new Observable((o) => {\n const inner = interval(50).subscribe({\n next: (i) => {\n if (i > 2) {\n o.next({\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: {\n name: \"mockedCurrentApp\",\n version: \"1.0.0\",\n },\n });\n o.complete();\n } else {\n o.next({\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.LOCKED,\n currentApp: {\n name: \"mockedCurrentApp\",\n version: \"1.0.0\",\n },\n });\n }\n },\n });\n\n return () => {\n inner.unsubscribe();\n };\n }),\n );\n\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n vi.spyOn(\n getDeviceStateDeviceAction,\n \"extractDependencies\",\n ).mockReturnValue(extractDependenciesMock());\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n ...onboardCheckPendingStatesWithOsVersionFetch(),\n {\n error,\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in an error if getAppAndVersion actor throws an error\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.LOCKED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n });\n\n getAppAndVersionMock.mockImplementation(() => {\n throw new UnknownDAError(\"error\");\n });\n\n waitForDeviceUnlockMock.mockImplementation(\n () =>\n new Observable((o) => {\n o.complete();\n }),\n );\n\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n vi.spyOn(\n getDeviceStateDeviceAction,\n \"extractDependencies\",\n ).mockReturnValue(extractDependenciesMock());\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n ...onboardCheckPendingStatesWithOsVersionFetch(),\n {\n error: new UnknownDAError(\"error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n });\n\n it(\"should emit a stopped state if the action is cancelled\", () =>\n new Promise<void>((resolve, reject) => {\n apiGetDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n installedApps: [],\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: false,\n });\n\n sendCommandMock\n .mockResolvedValueOnce(osVersionCommandResult())\n .mockResolvedValue(\n CommandResultFactory({\n data: {\n name: \"BOLOS\",\n version: \"1.0.0\",\n },\n }),\n );\n\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n onboardCheckPendingState(),\n {\n status: DeviceActionStatus.Stopped,\n },\n ];\n\n const { cancel } = testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n cancel();\n }));\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_rxjs", "import_CommandResult", "import_GetOsVersionCommand", "import_GlobalCommandError", "import_DeviceModel", "import_DeviceStatus", "import_makeInternalApi", "import_testDeviceActionStates", "import_DeviceActionState", "import_UserInteractionRequired", "import_Errors", "import_DeviceSessionState", "import_GetDeviceStatusDeviceAction", "import_types", "osVersionCommandResult", "props", "deviceModelId", "onboardCheckPendingState", "onboardCheckPendingStatesWithOsVersionFetch", "getAppAndVersionMock", "getOsVersionMock", "getDeviceSessionStateMock", "waitForDeviceUnlockMock", "setDeviceSessionState", "extractDependenciesMock", "sendCommandMock", "apiGetDeviceSessionStateMock", "apiGetDeviceSessionStateObservableMock", "resolve", "reject", "getDeviceStateDeviceAction", "expectedStates", "osVersionData", "o", "inner", "i", "error", "cancel"]
4
+ "sourcesContent": ["import { interval, Observable } from \"rxjs\";\n\nimport { CommandResultFactory } from \"@api/command/model/CommandResult\";\nimport { getOsVersionCommandResponseMockBuilder } from \"@api/command/os/__mocks__/GetOsVersionCommand\";\nimport { type GetOsVersionResponse } from \"@api/command/os/GetOsVersionCommand\";\nimport {\n GLOBAL_ERRORS,\n GlobalCommandError,\n} from \"@api/command/utils/GlobalCommandError\";\nimport { DeviceModelId } from \"@api/device/DeviceModel\";\nimport { DeviceStatus } from \"@api/device/DeviceStatus\";\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { testDeviceActionStates } from \"@api/device-action/__test-utils__/testDeviceActionStates\";\nimport { DeviceActionStatus } from \"@api/device-action/model/DeviceActionState\";\nimport { UserInteractionRequired } from \"@api/device-action/model/UserInteractionRequired\";\nimport {\n DeviceLockedError,\n DeviceNotOnboardedError,\n UnknownDAError,\n} from \"@api/device-action/os/Errors\";\nimport { DeviceSessionStateType } from \"@api/device-session/DeviceSessionState\";\n\nimport { GetDeviceStatusDeviceAction } from \"./GetDeviceStatusDeviceAction\";\nimport {\n type GetDeviceStatusDAState,\n getDeviceStatusDAStateStep,\n} from \"./types\";\n\nconst osVersionCommandResult = (\n props: Partial<GetOsVersionResponse> = {},\n deviceModelId: DeviceModelId = DeviceModelId.NANO_X,\n) =>\n CommandResultFactory({\n data: getOsVersionCommandResponseMockBuilder(deviceModelId, props),\n });\n\nconst appAndVersionResult = (name: string, version: string) =>\n CommandResultFactory({\n data: {\n name,\n version,\n },\n });\n\nconst lockedErrorResult = () =>\n CommandResultFactory({\n error: new GlobalCommandError({\n ...GLOBAL_ERRORS[\"5515\"],\n errorCode: \"5515\",\n }),\n });\n\nconst onboardCheckPendingState = (): GetDeviceStatusDAState => ({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n status: DeviceActionStatus.Pending,\n});\n\nconst onboardCheckPendingStatesWithOsVersionFetch =\n (): Array<GetDeviceStatusDAState> => [\n onboardCheckPendingState(),\n onboardCheckPendingState(),\n ];\n\nconst unlockRequestedPendingState = (): GetDeviceStatusDAState => ({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n step: getDeviceStatusDAStateStep.UNLOCK_DEVICE,\n },\n status: DeviceActionStatus.Pending,\n});\n\nconst unlockResolvedPendingState = (): GetDeviceStatusDAState => ({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.UNLOCK_DEVICE,\n },\n status: DeviceActionStatus.Pending,\n});\n\ndescribe(\"GetDeviceStatusDeviceAction\", () => {\n const getAppAndVersionMock = vi.fn();\n const getOsVersionMock = vi.fn();\n const getDeviceSessionStateMock = vi.fn();\n const waitForDeviceUnlockMock = vi.fn();\n const setDeviceSessionState = vi.fn();\n\n function extractDependenciesMock() {\n return {\n getAppAndVersion: getAppAndVersionMock,\n getOsVersion: getOsVersionMock,\n getDeviceSessionState: getDeviceSessionStateMock,\n waitForDeviceUnlock: waitForDeviceUnlockMock,\n setDeviceSessionState: setDeviceSessionState,\n };\n }\n\n const {\n sendCommand: sendCommandMock,\n getDeviceSessionState: apiGetDeviceSessionStateMock,\n getDeviceSessionStateObservable: apiGetDeviceSessionStateObservableMock,\n } = makeDeviceActionInternalApiMock();\n beforeEach(() => {\n vi.resetAllMocks();\n getOsVersionMock.mockResolvedValue(osVersionCommandResult());\n });\n\n describe(\"without overriding `extractDependencies`\", () => {\n it(\"should run the device action with an unlocked device\", () =>\n new Promise<void>((resolve, reject) => {\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n apiGetDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n deviceModelId: DeviceModelId.NANO_X,\n });\n\n // GetAppAndVersion is called first to determine the current app, then\n // GetOsVersion is called because the app is BOLOS (dashboard).\n sendCommandMock.mockImplementation((command) =>\n command.name === \"getOsVersion\"\n ? Promise.resolve(osVersionCommandResult())\n : Promise.resolve(appAndVersionResult(\"BOLOS\", \"1.0.0\")),\n );\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n ...onboardCheckPendingStatesWithOsVersionFetch(),\n {\n output: {\n currentApp: \"BOLOS\",\n currentAppVersion: \"1.0.0\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should run the device action with a locked device\", () =>\n new Promise<void>((resolve, reject) => {\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 1500 },\n });\n\n apiGetDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.LOCKED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n installedApps: [],\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: false,\n });\n\n // First GetAppAndVersion fails because the device is locked, then it\n // succeeds (BOLOS) once unlocked, then GetOsVersion is fetched.\n let appCall = 0;\n sendCommandMock.mockImplementation((command) => {\n if (command.name === \"getOsVersion\") {\n return Promise.resolve(osVersionCommandResult());\n }\n appCall += 1;\n if (appCall === 1) {\n return Promise.resolve(lockedErrorResult());\n }\n return Promise.resolve(appAndVersionResult(\"BOLOS\", \"1.0.0\"));\n });\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n onboardCheckPendingState(),\n unlockRequestedPendingState(),\n unlockResolvedPendingState(),\n unlockResolvedPendingState(),\n {\n output: {\n currentApp: \"BOLOS\",\n currentAppVersion: \"1.0.0\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should timeout with a locked device\", () =>\n new Promise<void>((resolve, reject) => {\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 200 },\n });\n\n apiGetDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.LOCKED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n installedApps: [],\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: false,\n });\n\n // GetAppAndVersion always reports a locked device, so the unlock\n // polling times out.\n sendCommandMock.mockImplementation((command) =>\n command.name === \"getOsVersion\"\n ? Promise.resolve(osVersionCommandResult())\n : Promise.resolve(lockedErrorResult()),\n );\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n onboardCheckPendingState(),\n unlockRequestedPendingState(),\n {\n error: new DeviceLockedError(\"Device locked.\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should run the device action with an old firmware not supporting GetAppAndVersion\", () =>\n new Promise<void>((resolve, reject) => {\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n apiGetDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n deviceModelId: DeviceModelId.NANO_X,\n });\n\n // GetAppAndVersion is not supported (CLA_NOT_SUPPORTED), which means we\n // are on the dashboard of an old firmware: the current app is BOLOS so\n // the OS version can still be fetched.\n sendCommandMock.mockImplementation((command) =>\n command.name === \"getOsVersion\"\n ? Promise.resolve(osVersionCommandResult())\n : Promise.resolve(\n CommandResultFactory({\n error: new GlobalCommandError({\n ...GLOBAL_ERRORS[\"6e00\"],\n errorCode: \"6e00\",\n }),\n }),\n ),\n );\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n ...onboardCheckPendingStatesWithOsVersionFetch(),\n {\n output: {\n currentApp: \"BOLOS\",\n currentAppVersion: \"0.0.0\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n });\n\n describe(\"success cases\", () => {\n it(\"should return the device status if the device is unlocked\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n });\n\n getAppAndVersionMock.mockResolvedValue(\n appAndVersionResult(\"BOLOS\", \"1.0.0\"),\n );\n\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: undefined },\n });\n\n vi.spyOn(\n getDeviceStateDeviceAction,\n \"extractDependencies\",\n ).mockReturnValue(extractDependenciesMock());\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n ...onboardCheckPendingStatesWithOsVersionFetch(),\n {\n status: DeviceActionStatus.Completed,\n output: {\n currentApp: \"BOLOS\",\n currentAppVersion: \"1.0.0\",\n },\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: () => {\n // Session should be updated with current app\n expect(setDeviceSessionState).toHaveBeenCalledWith({\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: {\n name: \"BOLOS\",\n version: \"1.0.0\",\n },\n });\n resolve();\n },\n onError: reject,\n },\n );\n }));\n\n it(\"should return the device status and update session if the device is not ready\", () =>\n new Promise<void>((resolve, reject) => {\n // The session state is stateful so the firmware version enrichment from\n // the OS version (which reads back the ready state) can be observed.\n let sessionState: object = {\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n deviceModelId: DeviceModelId.NANO_X,\n };\n getDeviceSessionStateMock.mockImplementation(() => sessionState);\n setDeviceSessionState.mockImplementation((state) => {\n sessionState = state;\n return state;\n });\n\n getAppAndVersionMock.mockResolvedValue(\n appAndVersionResult(\"BOLOS\", \"1.0.0\"),\n );\n\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: undefined },\n });\n\n vi.spyOn(\n getDeviceStateDeviceAction,\n \"extractDependencies\",\n ).mockReturnValue(extractDependenciesMock());\n\n const osVersionData = getOsVersionCommandResponseMockBuilder(\n DeviceModelId.NANO_X,\n );\n const expectedStates: Array<GetDeviceStatusDAState> = [\n ...onboardCheckPendingStatesWithOsVersionFetch(),\n {\n status: DeviceActionStatus.Completed,\n output: {\n currentApp: \"BOLOS\",\n currentAppVersion: \"1.0.0\",\n },\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: () => {\n // Session should be set as ready if GetAppAndVersionCommand was successful\n // and then enriched with the firmware version from the OS version.\n expect(setDeviceSessionState).toHaveBeenCalledWith({\n deviceModelId: DeviceModelId.NANO_X,\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: {\n name: \"BOLOS\",\n version: \"1.0.0\",\n },\n installedApps: [],\n isSecureConnectionAllowed:\n osVersionData.secureElementFlags.isSecureConnectionAllowed,\n firmwareVersion: {\n mcu: osVersionData.mcuSephVersion,\n bootloader: osVersionData.mcuBootloaderVersion,\n os: osVersionData.seVersion,\n metadata: osVersionData,\n },\n });\n resolve();\n },\n onError: reject,\n },\n );\n }));\n\n it(\"should not fetch the OS version when an app other than BOLOS is open\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n deviceModelId: DeviceModelId.NANO_X,\n });\n\n // An application is open: the device is necessarily onboarded and the\n // OS version cannot be read outside of the dashboard.\n getAppAndVersionMock.mockResolvedValue(\n appAndVersionResult(\"Bitcoin\", \"2.1.0\"),\n );\n\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: undefined },\n });\n\n vi.spyOn(\n getDeviceStateDeviceAction,\n \"extractDependencies\",\n ).mockReturnValue(extractDependenciesMock());\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n onboardCheckPendingState(),\n {\n status: DeviceActionStatus.Completed,\n output: {\n currentApp: \"Bitcoin\",\n currentAppVersion: \"2.1.0\",\n },\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: () => {\n expect(getOsVersionMock).not.toHaveBeenCalled();\n resolve();\n },\n onError: reject,\n },\n );\n }));\n\n it(\"should return the device status if the device is locked and the user unlocks the device\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.LOCKED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n });\n\n getAppAndVersionMock\n .mockResolvedValueOnce(lockedErrorResult())\n .mockResolvedValueOnce(appAndVersionResult(\"BOLOS\", \"1.0.0\"));\n\n waitForDeviceUnlockMock.mockImplementation(\n () =>\n new Observable((o) => {\n const inner = interval(50).subscribe({\n next: (i) => {\n if (i > 2) {\n o.next({\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: {\n name: \"mockedCurrentApp\",\n version: \"1.0.0\",\n },\n });\n o.complete();\n } else {\n o.next({\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.LOCKED,\n currentApp: {\n name: \"mockedCurrentApp\",\n version: \"1.0.0\",\n },\n });\n }\n },\n });\n\n return () => {\n inner.unsubscribe();\n };\n }),\n );\n\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n vi.spyOn(\n getDeviceStateDeviceAction,\n \"extractDependencies\",\n ).mockReturnValue(extractDependenciesMock());\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n onboardCheckPendingState(),\n unlockRequestedPendingState(),\n unlockResolvedPendingState(),\n unlockResolvedPendingState(),\n {\n status: DeviceActionStatus.Completed,\n output: {\n currentApp: \"BOLOS\",\n currentAppVersion: \"1.0.0\",\n },\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n });\n\n describe(\"errors cases\", () => {\n it(\"should end in an error if the device is not onboarded\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"BOLOS\", version: \"1.0.0\" },\n installedApps: [],\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: false,\n });\n // A non-onboarded device sits on the dashboard (BOLOS), so the app check\n // succeeds and the OS version reveals the onboarding status.\n getAppAndVersionMock.mockResolvedValue(\n appAndVersionResult(\"BOLOS\", \"1.0.0\"),\n );\n getOsVersionMock.mockResolvedValue(\n osVersionCommandResult({\n secureElementFlags: {\n ...getOsVersionCommandResponseMockBuilder().secureElementFlags,\n isOnboarded: false,\n },\n }),\n );\n\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n vi.spyOn(\n getDeviceStateDeviceAction,\n \"extractDependencies\",\n ).mockReturnValue(extractDependenciesMock());\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n ...onboardCheckPendingStatesWithOsVersionFetch(),\n {\n error: new DeviceNotOnboardedError(),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in an error if the device is locked and the user does not unlock\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.LOCKED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n });\n\n getAppAndVersionMock.mockResolvedValue(lockedErrorResult());\n\n waitForDeviceUnlockMock.mockImplementation(\n () =>\n new Observable((o) => {\n o.error(new DeviceLockedError(\"Device locked.\"));\n }),\n );\n\n apiGetDeviceSessionStateObservableMock.mockImplementation(\n () =>\n new Observable((o) => {\n const inner = interval(200).subscribe({\n next: () => {\n o.next({\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.LOCKED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n installedApps: [],\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: false,\n });\n },\n });\n\n return () => {\n inner.unsubscribe();\n };\n }),\n );\n\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n vi.spyOn(\n getDeviceStateDeviceAction,\n \"extractDependencies\",\n ).mockReturnValue(extractDependenciesMock());\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n onboardCheckPendingState(),\n unlockRequestedPendingState(),\n {\n error: new DeviceLockedError(\"Device locked.\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in an error if the GetAppAndVersion command fails\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.LOCKED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n });\n\n const error = new GlobalCommandError({\n ...GLOBAL_ERRORS[\"5501\"],\n errorCode: \"5501\",\n });\n\n getAppAndVersionMock.mockResolvedValue(CommandResultFactory({ error }));\n\n waitForDeviceUnlockMock.mockImplementation(\n () =>\n new Observable((o) => {\n o.complete();\n }),\n );\n\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n vi.spyOn(\n getDeviceStateDeviceAction,\n \"extractDependencies\",\n ).mockReturnValue(extractDependenciesMock());\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n onboardCheckPendingState(),\n {\n error,\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in an error if getAppAndVersion actor throws an error\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.LOCKED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n });\n\n getAppAndVersionMock.mockImplementation(() => {\n throw new UnknownDAError(\"error\");\n });\n\n waitForDeviceUnlockMock.mockImplementation(\n () =>\n new Observable((o) => {\n o.complete();\n }),\n );\n\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n vi.spyOn(\n getDeviceStateDeviceAction,\n \"extractDependencies\",\n ).mockReturnValue(extractDependenciesMock());\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n onboardCheckPendingState(),\n {\n error: new UnknownDAError(\"error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n });\n\n it(\"should emit a stopped state if the action is cancelled\", () =>\n new Promise<void>((resolve, reject) => {\n apiGetDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n installedApps: [],\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: false,\n });\n\n sendCommandMock.mockImplementation((command) =>\n command.name === \"getOsVersion\"\n ? Promise.resolve(osVersionCommandResult())\n : Promise.resolve(appAndVersionResult(\"BOLOS\", \"1.0.0\")),\n );\n\n const getDeviceStateDeviceAction = new GetDeviceStatusDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n const expectedStates: Array<GetDeviceStatusDAState> = [\n onboardCheckPendingState(),\n {\n status: DeviceActionStatus.Stopped,\n },\n ];\n\n const { cancel } = testDeviceActionStates(\n getDeviceStateDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n cancel();\n }));\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_rxjs", "import_CommandResult", "import_GetOsVersionCommand", "import_GlobalCommandError", "import_DeviceModel", "import_DeviceStatus", "import_makeInternalApi", "import_testDeviceActionStates", "import_DeviceActionState", "import_UserInteractionRequired", "import_Errors", "import_DeviceSessionState", "import_GetDeviceStatusDeviceAction", "import_types", "osVersionCommandResult", "props", "deviceModelId", "appAndVersionResult", "name", "version", "lockedErrorResult", "onboardCheckPendingState", "onboardCheckPendingStatesWithOsVersionFetch", "unlockRequestedPendingState", "unlockResolvedPendingState", "getAppAndVersionMock", "getOsVersionMock", "getDeviceSessionStateMock", "waitForDeviceUnlockMock", "setDeviceSessionState", "extractDependenciesMock", "sendCommandMock", "apiGetDeviceSessionStateMock", "apiGetDeviceSessionStateObservableMock", "resolve", "reject", "getDeviceStateDeviceAction", "command", "expectedStates", "appCall", "sessionState", "state", "osVersionData", "o", "inner", "i", "error", "cancel"]
7
7
  }
@@ -63,5 +63,5 @@
63
63
  "watch:builds": "pnpm ldmk-tool watch --entryPoints index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
64
64
  "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
65
65
  },
66
- "version": "0.0.0-develop-20260531003330"
66
+ "version": "0.0.0-develop-20260602003742"
67
67
  }
@@ -1,2 +1,2 @@
1
- import{Left as k,Right as E}from"purify-ts";import{EMPTY as C,from as h,interval as G,mergeMap as b,of as M,switchMap as U,take as x}from"rxjs";import{timeout as w}from"rxjs/operators";import{assign as r,fromObservable as F,fromPromise as A,setup as I}from"xstate";import{isSuccessCommandResult as d}from"../../../command/model/CommandResult";import{GetAppAndVersionCommand as V}from"../../../command/os/GetAppAndVersionCommand";import{GetOsVersionCommand as N}from"../../../command/os/GetOsVersionCommand";import{DeviceStatus as R}from"../../../device/DeviceStatus";import{UserInteractionRequired as c}from"../../../device-action/model/UserInteractionRequired";import{DEFAULT_UNLOCK_TIMEOUT_MS as T}from"../../../device-action/os/Const";import{DeviceLockedError as _,DeviceNotOnboardedError as L}from"../../../device-action/os/Errors";import{XStateDeviceAction as q}from"../../../device-action/xstate-utils/XStateDeviceAction";import{DeviceSessionStateType as p}from"../../../device-session/DeviceSessionState";import{getDeviceStatusDAStateStep as l}from"./types";const g=s=>({mcu:s.mcuSephVersion,bootloader:s.mcuBootloaderVersion,os:s.seVersion,metadata:s});class te extends q{makeStateMachine(a){const{getAppAndVersion:m,getOsVersion:S,getDeviceSessionState:n,setDeviceSessionState:i,waitForDeviceUnlock:D}=this.extractDependencies(a),v=this.input.unlockTimeout??T,O=e=>{const t=n();"firmwareVersion"in t&&i({...t,firmwareVersion:g(e),isSecureConnectionAllowed:e.secureElementFlags.isSecureConnectionAllowed})},u=()=>{const e=n();if("firmwareVersion"in e)return e.firmwareVersion?.metadata};return I({types:{input:{unlockTimeout:v},context:{},output:{}},actors:{getAppAndVersion:A(m),getOsVersion:A(S),waitForDeviceUnlock:F(D)},guards:{isOnboardedFromCachedMetadata:()=>u()?.secureElementFlags.isOnboarded===!0,isNotOnboardedFromCachedMetadata:()=>{const e=u();return e!==void 0&&!e.secureElementFlags.isOnboarded},needsOsVersionFetch:()=>u()===void 0,isOnboardedFromOsVersion:({context:e})=>e._internalState.osVersionMetadata?.secureElementFlags.isOnboarded===!0,isDeviceLocked:({context:e})=>e._internalState.locked,hasError:({context:e})=>e._internalState.error!==null},actions:{assignErrorDeviceNotOnboarded:r({_internalState:e=>({...e.context._internalState,error:new L})}),assignErrorDeviceLocked:r({_internalState:e=>({...e.context._internalState,error:new _}),intermediateValue:{requiredUserInteraction:c.UnlockDevice,step:l.UNLOCK_DEVICE}}),assignErrorFromEvent:r({_internalState:e=>({...e.context._internalState,error:e.event.error})}),assignNoUserActionNeeded:r({intermediateValue:e=>({...e.context.intermediateValue,requiredUserInteraction:c.None})}),assignUserActionUnlockNeeded:r({intermediateValue:e=>({...e.context.intermediateValue,requiredUserInteraction:c.UnlockDevice,step:l.UNLOCK_DEVICE})})}}).createMachine({id:"GetDeviceStatusDeviceAction",initial:"DeviceReady",context:e=>{const t=n(),{sessionStateType:o}=t;return{input:{unlockTimeout:e.input.unlockTimeout},intermediateValue:{requiredUserInteraction:c.None,step:l.ONBOARD_CHECK},_internalState:{onboarded:!1,locked:!1,currentApp:o===p.ReadyWithoutSecureChannel?t.currentApp.name:null,currentAppVersion:null,osVersionMetadata:null,error:null}}},states:{DeviceReady:{always:{target:"OnboardingCheck"}},OnboardingCheck:{always:[{guard:"isOnboardedFromCachedMetadata",target:"AppAndVersionCheck",actions:r({_internalState:e=>({...e.context._internalState,onboarded:!0})})},{guard:"isNotOnboardedFromCachedMetadata",target:"Error",actions:"assignErrorDeviceNotOnboarded"},{guard:"needsOsVersionFetch",target:"GetOsVersion"}]},GetOsVersion:{invoke:{src:"getOsVersion",onDone:{target:"OnboardingResultCheck",actions:r({_internalState:e=>d(e.event.output)?(O(e.event.output.data),{...e.context._internalState,osVersionMetadata:e.event.output.data}):{...e.context._internalState,error:e.event.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},OnboardingResultCheck:{always:[{guard:"hasError",target:"Error"},{guard:"isOnboardedFromOsVersion",target:"AppAndVersionCheck",actions:r({_internalState:e=>({...e.context._internalState,onboarded:!0})})},{target:"Error",actions:"assignErrorDeviceNotOnboarded"}]},UserActionUnlockDevice:{entry:"assignUserActionUnlockNeeded",exit:"assignNoUserActionNeeded",invoke:{id:"UserActionUnlockDevice",src:"waitForDeviceUnlock",input:e=>({unlockTimeout:v}),onDone:{target:"AppAndVersionCheck",actions:r({_internalState:e=>({...e.context._internalState,locked:!1})})},onError:{target:"Error",actions:"assignErrorDeviceLocked"}}},AppAndVersionCheck:{invoke:{src:"getAppAndVersion",onDone:{target:"ApplicationAvailableResultCheck",actions:r({_internalState:e=>{if(d(e.event.output)){const t=n();if(t.sessionStateType!==p.Connected)i({...t,currentApp:e.event.output.data});else{const o=e.context._internalState.osVersionMetadata;i({deviceModelId:t.deviceModelId,sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:R.CONNECTED,currentApp:e.event.output.data,installedApps:[],isSecureConnectionAllowed:o?.secureElementFlags.isSecureConnectionAllowed??!1,...o!==null?{firmwareVersion:g(o)}:{}})}return{...e.context._internalState,locked:!1,currentApp:e.event.output.data.name,currentAppVersion:e.event.output.data.version}}if("errorCode"in e.event.output.error){if(e.event.output.error.errorCode==="5515")return{...e.context._internalState,locked:!0};if(e.event.output.error.errorCode==="6e00")return{...e.context._internalState,locked:!1,currentApp:"BOLOS",currentAppVersion:"0.0.0"}}return{...e.context._internalState,error:e.event.output.error}}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},ApplicationAvailableResultCheck:{always:[{guard:"hasError",target:"Error"},{target:"UserActionUnlockDevice",guard:"isDeviceLocked"},{target:"Success"}]},Success:{type:"final"},Error:{type:"final"}},output:e=>{const{context:t}=e,{error:o,currentApp:y,currentAppVersion:f}=t._internalState;return o?k(o):E({currentApp:y,currentAppVersion:f})}})}extractDependencies(a){return{getAppAndVersion:()=>a.sendCommand(new V),getOsVersion:()=>a.sendCommand(new N),waitForDeviceUnlock:({input:n})=>G(1e3).pipe(U(()=>h(a.sendCommand(new V))),b(i=>!d(i)&&"errorCode"in i.error&&i.error.errorCode==="5515"?C:M(void 0)),x(1),w(n.unlockTimeout)),getDeviceSessionState:()=>a.getDeviceSessionState(),setDeviceSessionState:n=>a.setDeviceSessionState(n)}}}export{te as GetDeviceStatusDeviceAction};
1
+ import{Left as k,Right as O}from"purify-ts";import{EMPTY as f,from as E,interval as C,mergeMap as G,of as h,switchMap as U,take as x}from"rxjs";import{timeout as b}from"rxjs/operators";import{assign as r,fromObservable as I,fromPromise as v,setup as M}from"xstate";import{isSuccessCommandResult as p}from"../../../command/model/CommandResult";import{GetAppAndVersionCommand as A}from"../../../command/os/GetAppAndVersionCommand";import{GetOsVersionCommand as w}from"../../../command/os/GetOsVersionCommand";import{DeviceStatus as R}from"../../../device/DeviceStatus";import{UserInteractionRequired as c}from"../../../device-action/model/UserInteractionRequired";import{DEFAULT_UNLOCK_TIMEOUT_MS as T}from"../../../device-action/os/Const";import{DeviceLockedError as F,DeviceNotOnboardedError as N}from"../../../device-action/os/Errors";import{XStateDeviceAction as _}from"../../../device-action/xstate-utils/XStateDeviceAction";import{DeviceSessionStateType as u}from"../../../device-session/DeviceSessionState";import{getDeviceStatusDAStateStep as l}from"./types";const L=a=>({mcu:a.mcuSephVersion,bootloader:a.mcuBootloaderVersion,os:a.seVersion,metadata:a});class ee extends _{makeStateMachine(n){const{getAppAndVersion:d,getOsVersion:S,getDeviceSessionState:o,setDeviceSessionState:i,waitForDeviceUnlock:m}=this.extractDependencies(n),D=this.input.unlockTimeout??T,V=e=>{const t=o();t.sessionStateType!==u.Connected&&i({...t,firmwareVersion:L(e),isSecureConnectionAllowed:e.secureElementFlags.isSecureConnectionAllowed})};return M({types:{input:{unlockTimeout:D},context:{},output:{}},actors:{getAppAndVersion:v(d),getOsVersion:v(S),waitForDeviceUnlock:I(m)},guards:{isCurrentAppBolos:({context:e})=>e._internalState.currentApp==="BOLOS",isOnboardedFromOsVersion:({context:e})=>e._internalState.osVersionMetadata?.secureElementFlags.isOnboarded===!0,isDeviceLocked:({context:e})=>e._internalState.locked,hasError:({context:e})=>e._internalState.error!==null},actions:{assignErrorDeviceNotOnboarded:r({_internalState:e=>({...e.context._internalState,error:new N})}),assignErrorDeviceLocked:r({_internalState:e=>({...e.context._internalState,error:new F}),intermediateValue:{requiredUserInteraction:c.UnlockDevice,step:l.UNLOCK_DEVICE}}),assignErrorFromEvent:r({_internalState:e=>({...e.context._internalState,error:e.event.error})}),assignNoUserActionNeeded:r({intermediateValue:e=>({...e.context.intermediateValue,requiredUserInteraction:c.None})}),assignUserActionUnlockNeeded:r({intermediateValue:e=>({...e.context.intermediateValue,requiredUserInteraction:c.UnlockDevice,step:l.UNLOCK_DEVICE})})}}).createMachine({id:"GetDeviceStatusDeviceAction",initial:"DeviceReady",context:e=>{const t=o(),{sessionStateType:s}=t;return{input:{unlockTimeout:e.input.unlockTimeout},intermediateValue:{requiredUserInteraction:c.None,step:l.ONBOARD_CHECK},_internalState:{onboarded:!1,locked:!1,currentApp:s===u.ReadyWithoutSecureChannel?t.currentApp.name:null,currentAppVersion:null,osVersionMetadata:null,error:null}}},states:{DeviceReady:{always:{target:"AppAndVersionCheck"}},AppAndVersionCheck:{invoke:{src:"getAppAndVersion",onDone:{target:"ApplicationAvailableResultCheck",actions:r({_internalState:e=>{if(p(e.event.output)){const t=o();return t.sessionStateType!==u.Connected?i({...t,currentApp:e.event.output.data}):i({deviceModelId:t.deviceModelId,sessionStateType:u.ReadyWithoutSecureChannel,deviceStatus:R.CONNECTED,currentApp:e.event.output.data,installedApps:[],isSecureConnectionAllowed:!1}),{...e.context._internalState,locked:!1,currentApp:e.event.output.data.name,currentAppVersion:e.event.output.data.version}}if("errorCode"in e.event.output.error){if(e.event.output.error.errorCode==="5515")return{...e.context._internalState,locked:!0};if(e.event.output.error.errorCode==="6e00")return{...e.context._internalState,locked:!1,currentApp:"BOLOS",currentAppVersion:"0.0.0"}}return{...e.context._internalState,error:e.event.output.error}}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},ApplicationAvailableResultCheck:{always:[{guard:"hasError",target:"Error"},{target:"UserActionUnlockDevice",guard:"isDeviceLocked"},{target:"OnboardingCheck"}]},OnboardingCheck:{always:[{guard:"isCurrentAppBolos",target:"GetOsVersion"},{target:"Success",actions:r({_internalState:e=>({...e.context._internalState,onboarded:!0})})}]},GetOsVersion:{invoke:{src:"getOsVersion",onDone:{target:"OnboardingResultCheck",actions:r({_internalState:e=>p(e.event.output)?(V(e.event.output.data),{...e.context._internalState,osVersionMetadata:e.event.output.data}):{...e.context._internalState,error:e.event.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},OnboardingResultCheck:{always:[{guard:"hasError",target:"Error"},{guard:"isOnboardedFromOsVersion",target:"Success",actions:r({_internalState:e=>({...e.context._internalState,onboarded:!0})})},{target:"Error",actions:"assignErrorDeviceNotOnboarded"}]},UserActionUnlockDevice:{entry:"assignUserActionUnlockNeeded",exit:"assignNoUserActionNeeded",invoke:{id:"UserActionUnlockDevice",src:"waitForDeviceUnlock",input:e=>({unlockTimeout:D}),onDone:{target:"AppAndVersionCheck",actions:r({_internalState:e=>({...e.context._internalState,locked:!1})})},onError:{target:"Error",actions:"assignErrorDeviceLocked"}}},Success:{type:"final"},Error:{type:"final"}},output:e=>{const{context:t}=e,{error:s,currentApp:g,currentAppVersion:y}=t._internalState;return s?k(s):O({currentApp:g,currentAppVersion:y})}})}extractDependencies(n){return{getAppAndVersion:()=>n.sendCommand(new A),getOsVersion:()=>n.sendCommand(new w),waitForDeviceUnlock:({input:o})=>C(1e3).pipe(U(()=>E(n.sendCommand(new A))),G(i=>!p(i)&&"errorCode"in i.error&&i.error.errorCode==="5515"?f:h(void 0)),x(1),b(o.unlockTimeout)),getDeviceSessionState:()=>n.getDeviceSessionState(),setDeviceSessionState:o=>n.setDeviceSessionState(o)}}}export{ee as GetDeviceStatusDeviceAction};
2
2
  //# sourceMappingURL=GetDeviceStatusDeviceAction.js.map