@ledgerhq/device-management-kit 1.5.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/lib/cjs/package.json +1 -2
  2. package/lib/cjs/src/api/command/os/__mocks__/GetOsVersionCommand.js +1 -1
  3. package/lib/cjs/src/api/command/os/__mocks__/GetOsVersionCommand.js.map +2 -2
  4. package/lib/cjs/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.js +1 -1
  5. package/lib/cjs/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.js.map +3 -3
  6. package/lib/cjs/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.test.js +1 -1
  7. package/lib/cjs/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.test.js.map +3 -3
  8. package/lib/cjs/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.js +1 -1
  9. package/lib/cjs/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.js.map +3 -3
  10. package/lib/cjs/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.test.js +1 -1
  11. package/lib/cjs/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.test.js.map +3 -3
  12. package/lib/cjs/src/api/device-action/os/WaitForAppAndVersion/WaitForAppAndVersionDeviceAction.js +2 -0
  13. package/lib/cjs/src/api/device-action/os/WaitForAppAndVersion/WaitForAppAndVersionDeviceAction.js.map +7 -0
  14. package/lib/cjs/src/api/device-action/os/WaitForAppAndVersion/WaitForAppAndVersionDeviceAction.test.js +2 -0
  15. package/lib/cjs/src/api/device-action/os/WaitForAppAndVersion/WaitForAppAndVersionDeviceAction.test.js.map +7 -0
  16. package/lib/cjs/src/api/device-action/os/WaitForAppAndVersion/types.js +2 -0
  17. package/lib/cjs/src/api/device-action/os/WaitForAppAndVersion/types.js.map +7 -0
  18. package/lib/cjs/src/api/index.js +1 -1
  19. package/lib/cjs/src/api/index.js.map +3 -3
  20. package/lib/cjs/src/api/logger-subscriber/service/WebLogsExporterLogger.js.map +2 -2
  21. package/lib/cjs/src/api/network/DmkNetworkClient.js +1 -1
  22. package/lib/cjs/src/api/network/DmkNetworkClient.js.map +3 -3
  23. package/lib/cjs/src/api/network/DmkNetworkClient.test.js +1 -1
  24. package/lib/cjs/src/api/network/DmkNetworkClient.test.js.map +3 -3
  25. package/lib/cjs/src/api/network/DmkNetworkClientError.js +1 -1
  26. package/lib/cjs/src/api/network/DmkNetworkClientError.js.map +2 -2
  27. package/lib/cjs/src/api/network/DmkNetworkClientHelpers.js +1 -1
  28. package/lib/cjs/src/api/network/DmkNetworkClientHelpers.js.map +3 -3
  29. package/lib/cjs/src/api/network/DmkNetworkClientHelpers.test.js +1 -1
  30. package/lib/cjs/src/api/network/DmkNetworkClientHelpers.test.js.map +3 -3
  31. package/lib/cjs/src/api/utils/AppName.js +1 -1
  32. package/lib/cjs/src/api/utils/AppName.js.map +3 -3
  33. package/lib/cjs/src/api/utils/Base64String.js +1 -1
  34. package/lib/cjs/src/api/utils/Base64String.js.map +3 -3
  35. package/lib/cjs/src/api/utils/Base64String.test.js +3 -1
  36. package/lib/cjs/src/api/utils/Base64String.test.js.map +3 -3
  37. package/lib/cjs/src/internal/secure-channel/data/DefaultSecureChannelDataSource.js +1 -1
  38. package/lib/cjs/src/internal/secure-channel/data/DefaultSecureChannelDataSource.js.map +3 -3
  39. package/lib/cjs/src/internal/secure-channel/data/DefaultSecureChannelDataSource.test.js +1 -1
  40. package/lib/cjs/src/internal/secure-channel/data/DefaultSecureChannelDataSource.test.js.map +2 -2
  41. package/lib/esm/package.json +1 -2
  42. package/lib/esm/src/api/command/os/__mocks__/GetOsVersionCommand.js +1 -1
  43. package/lib/esm/src/api/command/os/__mocks__/GetOsVersionCommand.js.map +2 -2
  44. package/lib/esm/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.js +1 -1
  45. package/lib/esm/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.js.map +3 -3
  46. package/lib/esm/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.test.js +1 -1
  47. package/lib/esm/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.test.js.map +3 -3
  48. package/lib/esm/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.js +1 -1
  49. package/lib/esm/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.js.map +3 -3
  50. package/lib/esm/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.test.js +1 -1
  51. package/lib/esm/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.test.js.map +3 -3
  52. package/lib/esm/src/api/device-action/os/WaitForAppAndVersion/WaitForAppAndVersionDeviceAction.js +2 -0
  53. package/lib/esm/src/api/device-action/os/WaitForAppAndVersion/WaitForAppAndVersionDeviceAction.js.map +7 -0
  54. package/lib/esm/src/api/device-action/os/WaitForAppAndVersion/WaitForAppAndVersionDeviceAction.test.js +2 -0
  55. package/lib/esm/src/api/device-action/os/WaitForAppAndVersion/WaitForAppAndVersionDeviceAction.test.js.map +7 -0
  56. package/lib/esm/src/api/device-action/os/WaitForAppAndVersion/types.js +2 -0
  57. package/lib/esm/src/api/device-action/os/WaitForAppAndVersion/types.js.map +7 -0
  58. package/lib/esm/src/api/index.js +1 -1
  59. package/lib/esm/src/api/index.js.map +3 -3
  60. package/lib/esm/src/api/logger-subscriber/service/WebLogsExporterLogger.js.map +2 -2
  61. package/lib/esm/src/api/network/DmkNetworkClient.js +1 -1
  62. package/lib/esm/src/api/network/DmkNetworkClient.js.map +3 -3
  63. package/lib/esm/src/api/network/DmkNetworkClient.test.js +1 -1
  64. package/lib/esm/src/api/network/DmkNetworkClient.test.js.map +3 -3
  65. package/lib/esm/src/api/network/DmkNetworkClientError.js +1 -1
  66. package/lib/esm/src/api/network/DmkNetworkClientError.js.map +2 -2
  67. package/lib/esm/src/api/network/DmkNetworkClientHelpers.js +1 -1
  68. package/lib/esm/src/api/network/DmkNetworkClientHelpers.js.map +3 -3
  69. package/lib/esm/src/api/network/DmkNetworkClientHelpers.test.js +1 -1
  70. package/lib/esm/src/api/network/DmkNetworkClientHelpers.test.js.map +3 -3
  71. package/lib/esm/src/api/utils/AppName.js +1 -1
  72. package/lib/esm/src/api/utils/AppName.js.map +3 -3
  73. package/lib/esm/src/api/utils/Base64String.js +1 -1
  74. package/lib/esm/src/api/utils/Base64String.js.map +3 -3
  75. package/lib/esm/src/api/utils/Base64String.test.js +3 -1
  76. package/lib/esm/src/api/utils/Base64String.test.js.map +3 -3
  77. package/lib/esm/src/internal/secure-channel/data/DefaultSecureChannelDataSource.js +1 -1
  78. package/lib/esm/src/internal/secure-channel/data/DefaultSecureChannelDataSource.js.map +3 -3
  79. package/lib/esm/src/internal/secure-channel/data/DefaultSecureChannelDataSource.test.js +1 -1
  80. package/lib/esm/src/internal/secure-channel/data/DefaultSecureChannelDataSource.test.js.map +2 -2
  81. package/lib/types/src/api/command/os/__mocks__/GetOsVersionCommand.d.ts.map +1 -1
  82. package/lib/types/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.d.ts +3 -1
  83. package/lib/types/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.d.ts.map +1 -1
  84. package/lib/types/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.d.ts +0 -1
  85. package/lib/types/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.d.ts.map +1 -1
  86. package/lib/types/src/api/device-action/os/WaitForAppAndVersion/WaitForAppAndVersionDeviceAction.d.ts +25 -0
  87. package/lib/types/src/api/device-action/os/WaitForAppAndVersion/WaitForAppAndVersionDeviceAction.d.ts.map +1 -0
  88. package/lib/types/src/api/device-action/os/WaitForAppAndVersion/WaitForAppAndVersionDeviceAction.test.d.ts +2 -0
  89. package/lib/types/src/api/device-action/os/WaitForAppAndVersion/WaitForAppAndVersionDeviceAction.test.d.ts.map +1 -0
  90. package/lib/types/src/api/device-action/os/WaitForAppAndVersion/types.d.ts +22 -0
  91. package/lib/types/src/api/device-action/os/WaitForAppAndVersion/types.d.ts.map +1 -0
  92. package/lib/types/src/api/index.d.ts +2 -0
  93. package/lib/types/src/api/index.d.ts.map +1 -1
  94. package/lib/types/src/api/logger-subscriber/service/WebLogsExporterLogger.d.ts.map +1 -1
  95. package/lib/types/src/api/network/DmkNetworkClient.d.ts +1 -6
  96. package/lib/types/src/api/network/DmkNetworkClient.d.ts.map +1 -1
  97. package/lib/types/src/api/network/DmkNetworkClientError.d.ts +2 -6
  98. package/lib/types/src/api/network/DmkNetworkClientError.d.ts.map +1 -1
  99. package/lib/types/src/api/network/DmkNetworkClientHelpers.d.ts +10 -7
  100. package/lib/types/src/api/network/DmkNetworkClientHelpers.d.ts.map +1 -1
  101. package/lib/types/src/api/utils/AppName.d.ts +2 -1
  102. package/lib/types/src/api/utils/AppName.d.ts.map +1 -1
  103. package/lib/types/src/api/utils/Base64String.d.ts.map +1 -1
  104. package/lib/types/src/internal/secure-channel/data/DefaultSecureChannelDataSource.d.ts.map +1 -1
  105. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  106. package/package.json +2 -3
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.ts"],
4
- "sourcesContent": ["import { Left, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport { isSuccessCommandResult } from \"@api/command/model/CommandResult\";\nimport {\n CloseAppCommand,\n type CloseAppCommandResult,\n} from \"@api/command/os/CloseAppCommand\";\nimport {\n OpenAppCommand,\n type OpenAppCommandResult,\n} from \"@api/command/os/OpenAppCommand\";\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 { DeviceNotOnboardedError } from \"@api/device-action/os/Errors\";\nimport { GetDeviceStatusDeviceAction } from \"@api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction\";\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} from \"@api/device-session/DeviceSessionState\";\nimport { DeviceDisconnectedWhileSendingError } from \"@api/transport/model/Errors\";\nimport { isDashboardName } from \"@api/utils/AppName\";\n\nimport {\n type OpenAppDAError,\n type OpenAppDAInput,\n type OpenAppDAIntermediateValue,\n type OpenAppDAOutput,\n openAppDAStateStep,\n} from \"./types\";\n\ntype OpenAppStateMachineInternalState = {\n readonly currentlyRunningApp: string | null;\n readonly error: OpenAppDAError | null;\n};\n\nexport type MachineDependencies = {\n readonly closeApp: () => Promise<CloseAppCommandResult>;\n readonly openApp: (arg0: {\n input: { appName: string };\n }) => Promise<OpenAppCommandResult>;\n readonly getDeviceSessionState: () => DeviceSessionState;\n readonly setDeviceSessionState: (state: DeviceSessionState) => void;\n readonly isDeviceOnboarded: () => boolean;\n};\n\nexport type ExtractMachineDependencies = (\n internalApi: InternalApi,\n) => MachineDependencies;\n\n/**\n * Opens a given app on the device.\n *\n * It checks if the device is onboarded, unlocked, and which app is currently open.\n * If the current app is the dashboard, it will directly open the requested app.\n * If another app is opened, it will close the current app and open the requested app.\n *\n * Example of usage:\n *\n * ```ts\n * const deviceAction = new OpenAppDeviceAction({\n * input: {\n * appName: \"MyApp\",\n * },\n * });\n * dmk.executeDeviceAction({ sessionId: \"mySessionId\", deviceAction });\n * ```\n */\nexport class OpenAppDeviceAction extends XStateDeviceAction<\n OpenAppDAOutput,\n OpenAppDAInput,\n OpenAppDAError,\n OpenAppDAIntermediateValue,\n OpenAppStateMachineInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n OpenAppDAOutput,\n OpenAppDAInput,\n OpenAppDAError,\n OpenAppDAIntermediateValue,\n OpenAppStateMachineInternalState\n > {\n type types = StateMachineTypes<\n OpenAppDAOutput,\n OpenAppDAInput,\n OpenAppDAError,\n OpenAppDAIntermediateValue,\n OpenAppStateMachineInternalState\n >;\n\n const {\n closeApp,\n openApp,\n getDeviceSessionState,\n isDeviceOnboarded,\n setDeviceSessionState,\n } = this.extractDependencies(internalApi);\n\n const unlockTimeout = this.input.unlockTimeout ?? DEFAULT_UNLOCK_TIMEOUT_MS;\n\n const getDeviceStatusMachine = new GetDeviceStatusDeviceAction({\n input: {\n unlockTimeout,\n },\n }).makeStateMachine(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n closeApp: fromPromise(closeApp),\n openApp: fromPromise(openApp),\n getDeviceStatus: getDeviceStatusMachine,\n },\n guards: {\n isDeviceOnboarded: () => isDeviceOnboarded(), // TODO: we don't have this info for now, this can be derived from the \"flags\" obtained in the getVersion command\n isRequestedAppOpen: ({ context }: { context: types[\"context\"] }) => {\n if (context._internalState.currentlyRunningApp === null) return false;\n return (\n context._internalState.currentlyRunningApp === context.input.appName\n );\n },\n isDashboardOpen: ({ context }: { context: types[\"context\"] }) => {\n if (context._internalState.currentlyRunningApp === null)\n throw new Error(\"context.currentlyRunningApp === null\");\n return isDashboardName(context._internalState.currentlyRunningApp);\n },\n hasDisconnectedWhileSending: ({ context }) =>\n context._internalState.error !== null &&\n context._internalState.error instanceof\n DeviceDisconnectedWhileSendingError,\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 assignUserActionNeededOpenApp: assign({\n intermediateValue: (_) =>\n ({\n ..._.context.intermediateValue,\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n }) satisfies types[\"context\"][\"intermediateValue\"],\n }),\n assignNoUserActionNeeded: assign({\n intermediateValue: (_) =>\n ({\n ..._.context.intermediateValue,\n requiredUserInteraction: UserInteractionRequired.None,\n }) satisfies types[\"context\"][\"intermediateValue\"],\n }),\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: _.event[\"error\"], // FIXME: add a typeguard\n }),\n }),\n assignNoError: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: null,\n }),\n }),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QHkAOYB2BBVqAiYAbgJYDGYWpALsQPYYB0BJ5ASmAIYQCeAxANoAGALqJQqWrGI16YkAA9EARhWCGADgAsAZm1b1SwUoDspgDQhuiAEzX1DbQE5tJlQDYlm414CsAXz8LNEwcfCIyCmo6RmQMACNaDgAnCGIMKABhAAswUgBrARE5CSkZDDlFBCUPbQYfZx91H0FtTRNjCysEbWM1bTdHAzcfH2q9awCg9GxcZgjKMoZYhOTU9Ozcgv4lUSQQEuloiuUauoamlrbzSxtBNTu7pW1BEe1rJUmQYJmwlkjFgAytHyaUyOXyhV24kkh1ke0q7w8DDcxmqjkM1l6Kh8nUQzR8DEEjjcz3UxKUjiMbk+31Cc3IC2iDCBIPW4K2O2KMLKxwQiKUyNRAwxWKUOJu3TaDFsw28bkExmsgnU-Rp0zp4QZUXoDFCABsyBwylhCBxiHqOHE9WBeBB6GAGGlCLQ8g7abNNf8mfrDcbTebLdaEE7gUbokJhBGuaUjvCbCSCdZNI5UQqhg1cQhNOprAxND4XP0xZTHI01SEPX9GTqfaQw-QTWaLVabWAkklaEkGKgLVQAGadgC2S3Vlfm2sYtfr2H9zaDIbrZQjUb2Bx5cb5CelydTxnT2nFXTcmjUBYTzlazkcE0CX1Hv3HiynfqbgbA7FgAFc9VQNhCV9CMZwqAlQuAWZwHiqbStI0mY+PmdRKNYxLZmKgjvDeUwVg+WpPrgBqLtEjYBi2H7fr+7ICJyq7crGIGIK0LwME8dzJuizzNNYmZeLmAysZ4Ph2KYmiaOWPz0l6Nb4b60R-lsRQ0UB5Qbq0pgMM4FJ8dYx4KpomaOJo6k9G4yHvEhBmYmJGpVhOurSYR9ByVRUL7LRwEKAxYq1PUkGtE8+ZaJmBh1A8hieMh17vFZY64UyeAcLAWQrCkTkAa5Sm8tY-TIkmlJvFojjXuocHysiegvB4JJ6P4t7ujhkmMPFiXJRAqXUYBsLKfRfLZSZyYtHYbF2JmQoaMeIweEmJjHtF9XVowGR6pIFD2dOtr2o6GDOq6I7YRJ80MIty3PtEwZbaGS4iGla50R5CBVYSJkFncbzGC4mYoo4zHlfUCo+KieizfttlHbAK09jJ9C8G2HZdj2RoDkkw51cDiyg+DBHTmdzoORgy4KR167dQ9ghPc8A1vUomZIQqeZksmTw9JoJlA56B3oyd9BkT+qUE+lnW8iohgaDoeioUYpgdBKQu5sz8rEgYxjwaJtX3qjTIc6tZTcxRmzOdGAsbqoagmM8Yr-aTTyOCNpXWAW-TGIMfmO6zNmLHVmNlOtGAOiGO0o2ztke5DGDYxd4ZXXzN3uZU1RPBBjTNM7UtdAWxjqQZ6gqv0LyO9oruPkywe49D7adt2vaI8jauB+796e6dC7TvjLnR11d1x955xJ1cKeIAZ6dGEJqJKk4qqq3ttdF-XIc67zrdue3CLVG4gqZyMpbGG4bhBeoq9b-mB7jaTZYT+JU86sX05z5R2wLxlG78oKYpNKW16mx9x6EkhWdGKTSvXgLrFKSENcbsC4Hwa6i9eQHgQgmCkIlBjKmcEFUY24ejaSTMeCkHxPgYFoBAOAcgA5u1um3XkABaHeEoKEEkKvQwQJ4XjKl6ErIBDUmCenATwA2RM7rknUm4FUhV-oiTJFTCUth05j0xJVFUTxt7sIOssRIKRQRyV4bdWOTNkTqDekqAwbxNDIUzFIhwzhZHVHkf0akZ9rKFx1CyPI6j2SaJjsoUsBIBimB8MMeUZJqFdH6PYDwKYBjwQaEYpRtlOYzlfC2NxS8bB6HsM4RUIwiSH0VNxAy6lkL1EEjTYUtisLn1ISAhuDZZxvhvpsRJmVX51FJFlZ4-Qk5wUYcxR2BTTIGUKtEvCoDpwaMUobbqugUzIg8PmEwIiTJ9yqAMaUW90IngCaIgZcUEpJVUa1Vxoy+GVGMbvZiuVf5IM8CoTZOpNZDL4eQjcIlDLIRRH5FhoxDyIGFMiASe8IoFlGNchaS0waxNqfkepG4tACiMGeQw6IiQeBGncMaMycxEl8eoIFu0fiVPbg87qSE3q6MVBpehPQ4K6G+uoZUJIVB7laNiq+2s4DkRGYTLRygs6GSQtmO4iIaWljgvUBgip-K5RErofOdiYocLBZwHhBzOWSkKqKz6Lw3i6U+QgPchlTB7xTPBeCWVHDYoAMqflIOQWA8AlXuO6KMQylImipgMi4BZzhDIKkpM0FEypRimplXNWyABRMuSRIXjNaKvHQ3h0Q0reCYT+3khGNEKgqIRxgAgBCAA */\n id: \"OpenAppDeviceAction\",\n initial: \"DeviceReady\",\n context: ({ input }) => {\n const sessionState = getDeviceSessionState();\n const { sessionStateType } = sessionState;\n return {\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n _internalState: {\n error: null,\n currentlyRunningApp:\n sessionStateType ===\n DeviceSessionStateType.ReadyWithoutSecureChannel\n ? sessionState.currentApp.name\n : null,\n },\n };\n },\n states: {\n DeviceReady: {\n // check device capabilities & status known\n always: {\n target: \"OnboardingCheck\",\n },\n },\n\n OnboardingCheck: {\n // check onboarding status provided by device session\n always: [\n {\n target: \"GetDeviceStatus\",\n guard: {\n type: \"isDeviceOnboarded\",\n },\n },\n {\n target: \"Error\",\n actions: \"assignErrorDeviceNotOnboarded\",\n },\n ],\n },\n\n GetDeviceStatus: {\n // We run the GetDeviceStatus flow to get information about the device state\n invoke: {\n id: \"deviceStatus\",\n src: \"getDeviceStatus\",\n input: (_) => ({\n unlockTimeout: _.context.input.unlockTimeout,\n }),\n onSnapshot: {\n actions: assign({\n intermediateValue: (_) =>\n _.event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n target: \"CheckDeviceStatus\",\n actions: assign({\n _internalState: (_) => {\n return _.event.output.caseOf<OpenAppStateMachineInternalState>(\n {\n Right: (output) => {\n const state: DeviceSessionState =\n getDeviceSessionState();\n\n if (\n state.sessionStateType !==\n DeviceSessionStateType.Connected\n ) {\n setDeviceSessionState({\n ...state,\n currentApp: {\n name: output.currentApp,\n version: output.currentAppVersion,\n },\n });\n }\n return {\n ..._.context._internalState,\n currentlyRunningApp: output.currentApp,\n };\n },\n Left: (error) => ({\n ..._.context._internalState,\n currentlyRunningApp: null,\n error,\n }),\n },\n );\n },\n }),\n },\n onError: {\n target: \"Error\",\n actions: [\n assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n currentlyRunningApp: null,\n }),\n }),\n \"assignErrorFromEvent\",\n ],\n },\n },\n },\n CheckDeviceStatus: {\n // We check the device status to see if we can have an error\n always: [\n {\n target: \"ApplicationReady\",\n guard: \"isRequestedAppOpen\",\n // If target app is currently opened, we can ignore errors\n actions: \"assignNoError\",\n },\n {\n target: \"Error\",\n guard: \"hasError\",\n },\n {\n target: \"DashboardCheck\",\n },\n ],\n },\n\n DashboardCheck: {\n // Is the current application the dashboard\n always: [\n {\n target: \"OpenApplication\",\n guard: \"isDashboardOpen\",\n },\n \"CloseApplication\",\n ],\n },\n\n OpenApplication: {\n // execute openApp command,\n entry: \"assignUserActionNeededOpenApp\",\n exit: \"assignNoUserActionNeeded\",\n invoke: {\n src: \"openApp\",\n input: ({ context }) => ({ appName: context.input.appName }),\n onDone: {\n target: \"OpenApplicationResultCheck\",\n actions: assign({\n _internalState: (_) => {\n if (isSuccessCommandResult(_.event.output)) {\n return {\n ..._.context._internalState,\n currentlyRunningApp: _.context.input.appName,\n };\n } else {\n return {\n ..._.context._internalState,\n error: _.event.output.error,\n };\n }\n },\n }),\n },\n onError: {\n target: \"OpenApplicationResultCheck\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n\n OpenApplicationResultCheck: {\n always: [\n {\n // When an APDU triggers a disconnection, some transports may possibly\n // be closed on device side before the APDU response could be received,\n // especially on BLE transports.\n // Therefore when a disconnection occurs while sending, we should verify\n // the device status because it may have been successfully executed.\n target: \"GetDeviceStatus\",\n guard: \"hasDisconnectedWhileSending\",\n },\n {\n target: \"Error\",\n guard: \"hasError\",\n },\n { target: \"GetDeviceStatus\" },\n ],\n },\n\n CloseApplication: {\n invoke: {\n src: \"closeApp\",\n onDone: {\n target: \"CloseApplicationResultCheck\",\n actions: assign({\n _internalState: (_) => {\n if (isSuccessCommandResult(_.event.output)) {\n return {\n ..._.context._internalState,\n currentlyRunningApp: \"BOLOS\",\n };\n } else {\n return {\n ..._.context._internalState,\n error: _.event.output.error,\n };\n }\n },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n CloseApplicationResultCheck: {\n always: [\n {\n target: \"Error\",\n guard: \"hasError\",\n },\n { target: \"OpenApplication\" },\n ],\n },\n\n ApplicationReady: {\n // application is ready to be used\n always: \"Success\",\n },\n\n // success state\n Success: {\n type: \"final\",\n actions: \"assignNoError\", // TODO, we should not need this\n },\n\n // error state\n Error: {\n type: \"final\",\n },\n },\n output: ({ context }) =>\n context._internalState.error // TODO: instead we should rely on the current state (\"Success\" or \"Error\")\n ? Left(context._internalState.error)\n : Right(undefined),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const closeApp = async () => internalApi.sendCommand(new CloseAppCommand());\n const openApp = async (arg0: { input: { appName: string } }) =>\n internalApi.sendCommand(\n new OpenAppCommand({ appName: arg0.input.appName }),\n );\n\n return {\n closeApp,\n openApp,\n getDeviceSessionState: () => internalApi.getDeviceSessionState(),\n setDeviceSessionState: (state: DeviceSessionState) =>\n internalApi.setDeviceSessionState(state),\n isDeviceOnboarded: () => true, // TODO: we don't have this info for now, this can be derived from the \"flags\" obtained in the getVersion command\n };\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["Left", "Right", "assign", "fromPromise", "setup", "isSuccessCommandResult", "CloseAppCommand", "OpenAppCommand", "UserInteractionRequired", "DEFAULT_UNLOCK_TIMEOUT_MS", "DeviceNotOnboardedError", "GetDeviceStatusDeviceAction", "XStateDeviceAction", "DeviceSessionStateType", "DeviceDisconnectedWhileSendingError", "isDashboardName", "openAppDAStateStep", "OpenAppDeviceAction", "internalApi", "closeApp", "openApp", "getDeviceSessionState", "isDeviceOnboarded", "setDeviceSessionState", "unlockTimeout", "getDeviceStatusMachine", "context", "_", "input", "sessionState", "sessionStateType", "output", "state", "error", "arg0"]
4
+ "sourcesContent": ["import { Left, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport { isSuccessCommandResult } from \"@api/command/model/CommandResult\";\nimport {\n CloseAppCommand,\n type CloseAppCommandResult,\n} from \"@api/command/os/CloseAppCommand\";\nimport {\n OpenAppCommand,\n type OpenAppCommandResult,\n} from \"@api/command/os/OpenAppCommand\";\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 { GetDeviceStatusDeviceAction } from \"@api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction\";\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} from \"@api/device-session/DeviceSessionState\";\nimport { DeviceDisconnectedWhileSendingError } from \"@api/transport/model/Errors\";\nimport { isDashboardName, LEDGER_OS_NAME } from \"@api/utils/AppName\";\n\nimport {\n type OpenAppDAError,\n type OpenAppDAInput,\n type OpenAppDAIntermediateValue,\n type OpenAppDAOutput,\n openAppDAStateStep,\n} from \"./types\";\n\ntype OpenAppStateMachineInternalState = {\n readonly currentlyRunningApp: string | null;\n readonly error: OpenAppDAError | null;\n};\n\nexport type MachineDependencies = {\n readonly closeApp: () => Promise<CloseAppCommandResult>;\n readonly openApp: (arg0: {\n input: { appName: string };\n }) => Promise<OpenAppCommandResult>;\n readonly getDeviceSessionState: () => DeviceSessionState;\n readonly setDeviceSessionState: (state: DeviceSessionState) => void;\n};\n\nexport type ExtractMachineDependencies = (\n internalApi: InternalApi,\n) => MachineDependencies;\n\n/**\n * Opens a given app on the device.\n *\n * It checks if the device is onboarded, unlocked, and which app is currently open.\n * If the current app is the dashboard, it will directly open the requested app.\n * If another app is opened, it will close the current app and open the requested app.\n *\n * Example of usage:\n *\n * ```ts\n * const deviceAction = new OpenAppDeviceAction({\n * input: {\n * appName: \"MyApp\",\n * },\n * });\n * dmk.executeDeviceAction({ sessionId: \"mySessionId\", deviceAction });\n * ```\n */\nexport class OpenAppDeviceAction extends XStateDeviceAction<\n OpenAppDAOutput,\n OpenAppDAInput,\n OpenAppDAError,\n OpenAppDAIntermediateValue,\n OpenAppStateMachineInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n OpenAppDAOutput,\n OpenAppDAInput,\n OpenAppDAError,\n OpenAppDAIntermediateValue,\n OpenAppStateMachineInternalState\n > {\n type types = StateMachineTypes<\n OpenAppDAOutput,\n OpenAppDAInput,\n OpenAppDAError,\n OpenAppDAIntermediateValue,\n OpenAppStateMachineInternalState\n >;\n\n const { closeApp, openApp, getDeviceSessionState, setDeviceSessionState } =\n this.extractDependencies(internalApi);\n\n const unlockTimeout = this.input.unlockTimeout ?? DEFAULT_UNLOCK_TIMEOUT_MS;\n\n const getDeviceStatusMachine = new GetDeviceStatusDeviceAction({\n input: {\n unlockTimeout,\n },\n }).makeStateMachine(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n closeApp: fromPromise(closeApp),\n openApp: fromPromise(openApp),\n getDeviceStatus: getDeviceStatusMachine,\n },\n guards: {\n isRequestedAppOpen: ({ context }: { context: types[\"context\"] }) => {\n if (context._internalState.currentlyRunningApp === null) return false;\n return (\n context._internalState.currentlyRunningApp === context.input.appName\n );\n },\n isDashboardOpen: ({ context }: { context: types[\"context\"] }) => {\n if (context._internalState.currentlyRunningApp === null)\n throw new Error(\"context.currentlyRunningApp === null\");\n return isDashboardName(context._internalState.currentlyRunningApp);\n },\n hasDisconnectedWhileSending: ({ context }) =>\n context._internalState.error !== null &&\n context._internalState.error instanceof\n DeviceDisconnectedWhileSendingError,\n hasError: ({ context }) => context._internalState.error !== null,\n },\n actions: {\n assignUserActionNeededOpenApp: assign({\n intermediateValue: (_) =>\n ({\n ..._.context.intermediateValue,\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n }) satisfies types[\"context\"][\"intermediateValue\"],\n }),\n assignNoUserActionNeeded: assign({\n intermediateValue: (_) =>\n ({\n ..._.context.intermediateValue,\n requiredUserInteraction: UserInteractionRequired.None,\n }) satisfies types[\"context\"][\"intermediateValue\"],\n }),\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: _.event[\"error\"], // FIXME: add a typeguard\n }),\n }),\n assignNoError: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: null,\n }),\n }),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QHkAOYB2BBVqAiYAbgJYDGYWpALsQPYYB0BJ5ASmAIYQCeAxANoAGALqJQqWrGI16YkAA9EARhWCGADgAsAZm1b1SwUoDspgDQhuiAEzX1DbQE5tJlQDYlm414CsAXz8LNEwcfCIyCmo6RmQMACNaDgAnCGIMKABhAAswUgBrARE5CSkZDDlFBCUPbQYfZx91H0FtTRNjCysEbWM1bTdHAzcfH2q9awCg9GxcZgjKMoZYhOTU9Ozcgv4lUSQQEuloiuUauoamlrbzSxtBNTu7pW1BEe1rJUmQYJmwlkjFgAytHyaUyOXyhV24kkh1ke0q7w8DDcxmqjkM1l6Kh8nUQzR8DEEjjcz3UxKUjiMbk+31Cc3IC2iDCBIPW4K2O2KMLKxwQiKUyNRAwxWKUOJu3TaDFsw28bkExmsgnU-Rp0zp4QZUXoDFCABsyBwylhCBxiHqOHE9WBeBB6GAGGlCLQ8g7abNNf8mfrDcbTebLdaEE7gUbokJhBGuaUjvCbCSCdZNI5UQqhg1cQhNOprAxND4XP0xZTHI01SEPX9GTqfaQw-QTWaLVabWAkklaEkGKgLVQAGadgC2S3Vlfm2sYtfr2H9zaDIbrZQjUb2Bx5cb5CelydTxnT2nFXTcmjUBYTzlazkcE0CX1Hv3HiynfqbgbA7FgAFc9VQNhCV9CMZwqAlQuAWZwHiqbStI0mY+PmdRKNYxLZmKgjvDeUwVg+WpPrgBqLtEjYBi2H7fr+7ICJyq7crGIGIK0LwME8dzJuizzNNYmZeLmAysZ4Ph2KYmiaOWPz0l6Nb4b60R-lsRQ0UB5Qbq0pgMM4FJ8dYx4KpomaOJo6k9G4yHvEhBmYmJGpVhOurSYR9ByVRUL7LRwEKAxYq1PUkGtE8+ZaJmBh1A8hieMh17vFZY64UyeAcLAWQrCkTkAa5Sm8tY-TIkmlJvFojjXuocHysiegvB4JJ6P4t7ujhkmMPFiXJRAqXUYBsLKfRfLZSZyYtHYbF2JmQoaMeIweEmJjHtF9XVowGR6pIFD2dOtr2o6GDOq6I7YRJ80MIty3PtEwZbaGS4iGla50R5CBVYSJkFncbzGC4mYoo4zHlfUCo+KieizfttlHbAK09jJ9C8G2HZdj2RoDkkw51cDiyg+DBHTmdzoORgy4KR167dQ9ghPc8A1vUomZIQqeZksmTw9JoJlA56B3oyd9BkT+qUE+lnW8iohgaDoeioUYpgdBKQu5sz8rEgYxjwaJtX3qjTIc6tZTcxRmzOdGAsbqoagmM8Yr-aTTyOCNpXWAW-TGIMfmO6zNmLHVmNlOtGAOiGO0o2ztke5DGDYxd4ZXXzN3uZU1RPBBjTNM7UtdAWxjqQZ6gqv0LyO9oruPkywe49D7adt2vaI8jauB+796e6dC7TvjLnR11d1x955xJ1cKeIAZ6dGEJqJKk4qqq3ttdF-XIc67zrdue3CLVG4gqZyMpbGG4bhBeoq9b-mB7jaTZYT+JU86sX05z5R2wLxlG78oKYpNKW16mx9x6EkhWdGKTSvXgLrFKSENcbsC4Hwa6i9eQHgQgmCkIlBjKmcEFUY24ejaSTMeCkHxPgYFoBAOAcgA5u1um3XkABaHeEoKEEkKvQwQJ4XjKl6ErIBDUmCenATwA2RM7rknUm4FUhV-oiTJFTCUth05j0xJVFUTxt7sIOssRIKRQRyV4bdWOTNkTqDekqAwbxNDIUzFIhwzhZHVHkf0akZ9rKFx1CyPI6j2SaJjsoUsBIBimB8MMeUZJqFdH6PYDwKYBjwQaEYpRtlOYzlfC2NxS8bB6HsM4RUIwiSH0VNxAy6lkL1EEjTYUtisLn1ISAhuDZZxvhvpsRJmVX51FJFlZ4-Qk5wUYcxR2BTTIGUKtEvCoDpwaMUobbqugUzIg8PmEwIiTJ9yqAMaUW90IngCaIgZcUEpJVUa1Vxoy+GVGMbvZiuVf5IM8CoTZOpNZDL4eQjcIlDLIRRH5FhoxDyIGFMiASe8IoFlGNchaS0waxNqfkepG4tACiMGeQw6IiQeBGncMaMycxEl8eoIFu0fiVPbg87qSE3q6MVBpehPQ4K6G+uoZUJIVB7laNiq+2s4DkRGYTLRygs6GSQtmO4iIaWljgvUBgip-K5RErofOdiYocLBZwHhBzOWSkKqKz6Lw3i6U+QgPchlTB7xTPBeCWVHDYoAMqflIOQWA8AlXuO6KMQylImipgMi4BZzhDIKkpM0FEypRimplXNWyABRMuSRIXjNaKvHQ3h0Q0reCYT+3khGNEKgqIRxgAgBCAA */\n id: \"OpenAppDeviceAction\",\n initial: \"DeviceReady\",\n context: ({ input }) => {\n const sessionState = getDeviceSessionState();\n const { sessionStateType } = sessionState;\n return {\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n _internalState: {\n error: null,\n currentlyRunningApp:\n sessionStateType ===\n DeviceSessionStateType.ReadyWithoutSecureChannel\n ? sessionState.currentApp.name\n : null,\n },\n };\n },\n states: {\n DeviceReady: {\n always: {\n target: \"GetDeviceStatus\",\n },\n },\n\n GetDeviceStatus: {\n // We run the GetDeviceStatus flow to get information about the device state\n invoke: {\n id: \"deviceStatus\",\n src: \"getDeviceStatus\",\n input: (_) => ({\n unlockTimeout: _.context.input.unlockTimeout,\n }),\n onSnapshot: {\n actions: assign({\n intermediateValue: (_) =>\n _.event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n target: \"CheckDeviceStatus\",\n actions: assign({\n _internalState: (_) => {\n return _.event.output.caseOf<OpenAppStateMachineInternalState>(\n {\n Right: (output) => {\n const state: DeviceSessionState =\n getDeviceSessionState();\n\n if (\n state.sessionStateType !==\n DeviceSessionStateType.Connected\n ) {\n setDeviceSessionState({\n ...state,\n currentApp: {\n name: output.currentApp,\n version: output.currentAppVersion,\n },\n });\n }\n return {\n ..._.context._internalState,\n currentlyRunningApp: output.currentApp,\n };\n },\n Left: (error) => ({\n ..._.context._internalState,\n currentlyRunningApp: null,\n error,\n }),\n },\n );\n },\n }),\n },\n onError: {\n target: \"Error\",\n actions: [\n assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n currentlyRunningApp: null,\n }),\n }),\n \"assignErrorFromEvent\",\n ],\n },\n },\n },\n CheckDeviceStatus: {\n // We check the device status to see if we can have an error\n always: [\n {\n target: \"ApplicationReady\",\n guard: \"isRequestedAppOpen\",\n // If target app is currently opened, we can ignore errors\n actions: \"assignNoError\",\n },\n {\n target: \"Error\",\n guard: \"hasError\",\n },\n {\n target: \"DashboardCheck\",\n },\n ],\n },\n\n DashboardCheck: {\n // Is the current application the dashboard\n always: [\n {\n target: \"OpenApplication\",\n guard: \"isDashboardOpen\",\n },\n \"CloseApplication\",\n ],\n },\n\n OpenApplication: {\n // execute openApp command,\n entry: \"assignUserActionNeededOpenApp\",\n exit: \"assignNoUserActionNeeded\",\n invoke: {\n src: \"openApp\",\n input: ({ context }) => ({ appName: context.input.appName }),\n onDone: {\n target: \"OpenApplicationResultCheck\",\n actions: assign({\n _internalState: (_) => {\n if (isSuccessCommandResult(_.event.output)) {\n return {\n ..._.context._internalState,\n currentlyRunningApp: _.context.input.appName,\n };\n } else {\n return {\n ..._.context._internalState,\n error: _.event.output.error,\n };\n }\n },\n }),\n },\n onError: {\n target: \"OpenApplicationResultCheck\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n\n OpenApplicationResultCheck: {\n always: [\n {\n // When an APDU triggers a disconnection, some transports may possibly\n // be closed on device side before the APDU response could be received,\n // especially on BLE transports.\n // Therefore when a disconnection occurs while sending, we should verify\n // the device status because it may have been successfully executed.\n target: \"GetDeviceStatus\",\n guard: \"hasDisconnectedWhileSending\",\n },\n {\n target: \"Error\",\n guard: \"hasError\",\n },\n { target: \"GetDeviceStatus\" },\n ],\n },\n\n CloseApplication: {\n invoke: {\n src: \"closeApp\",\n onDone: {\n target: \"CloseApplicationResultCheck\",\n actions: assign({\n _internalState: (_) => {\n if (isSuccessCommandResult(_.event.output)) {\n return {\n ..._.context._internalState,\n currentlyRunningApp: LEDGER_OS_NAME,\n };\n } else {\n return {\n ..._.context._internalState,\n error: _.event.output.error,\n };\n }\n },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n CloseApplicationResultCheck: {\n always: [\n {\n target: \"Error\",\n guard: \"hasError\",\n },\n { target: \"OpenApplication\" },\n ],\n },\n\n ApplicationReady: {\n // application is ready to be used\n always: \"Success\",\n },\n\n // success state\n Success: {\n type: \"final\",\n actions: \"assignNoError\", // TODO, we should not need this\n },\n\n // error state\n Error: {\n type: \"final\",\n },\n },\n output: ({ context }) =>\n context._internalState.error // TODO: instead we should rely on the current state (\"Success\" or \"Error\")\n ? Left(context._internalState.error)\n : Right(undefined),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const closeApp = async () => internalApi.sendCommand(new CloseAppCommand());\n const openApp = async (arg0: { input: { appName: string } }) =>\n internalApi.sendCommand(\n new OpenAppCommand({ appName: arg0.input.appName }),\n );\n\n return {\n closeApp,\n openApp,\n getDeviceSessionState: () => internalApi.getDeviceSessionState(),\n setDeviceSessionState: (state: DeviceSessionState) =>\n internalApi.setDeviceSessionState(state),\n };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Left", "Right", "assign", "fromPromise", "setup", "isSuccessCommandResult", "CloseAppCommand", "OpenAppCommand", "UserInteractionRequired", "DEFAULT_UNLOCK_TIMEOUT_MS", "GetDeviceStatusDeviceAction", "XStateDeviceAction", "DeviceSessionStateType", "DeviceDisconnectedWhileSendingError", "isDashboardName", "LEDGER_OS_NAME", "openAppDAStateStep", "OpenAppDeviceAction", "internalApi", "closeApp", "openApp", "getDeviceSessionState", "setDeviceSessionState", "unlockTimeout", "getDeviceStatusMachine", "context", "_", "input", "sessionState", "sessionStateType", "output", "state", "error", "arg0"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{lastValueFrom as T}from"rxjs";import{InvalidStatusWordError as C}from"../../../command/Errors";import{CommandResultFactory as l}from"../../../command/model/CommandResult";import{DeviceModelId as U}from"../../../device/DeviceModel";import{DeviceStatus as a}from"../../../device/DeviceStatus";import{makeDeviceActionInternalApiMock as c}from"../../../device-action/__test-utils__/makeInternalApi";import{setupGetDeviceStatusMock as D}from"../../../device-action/__test-utils__/setupTestMachine";import{testDeviceActionStates as d}from"../../../device-action/__test-utils__/testDeviceActionStates";import{DeviceActionStatus as e}from"../../../device-action/model/DeviceActionState";import{UserInteractionRequired as t}from"../../../device-action/model/UserInteractionRequired";import{DeviceLockedError as y,DeviceNotOnboardedError as w,UnknownDAError as E}from"../../../device-action/os/Errors";import{getDeviceStatusDAStateStep as s}from"../../../device-action/os/GetDeviceStatus/types";import{DeviceSessionStateType as p}from"../../../device-session/DeviceSessionState";import{DeviceDisconnectedWhileSendingError as k}from"../../../transport/model/Errors";import{OpenAppDeviceAction as A}from"./OpenAppDeviceAction";import{openAppDAStateStep as S}from"./types";vi.mock("@api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction");describe("OpenAppDeviceAction",()=>{const N=vi.fn(),O=vi.fn(),v=vi.fn(),u=vi.fn(),R=vi.fn(),h=vi.fn();function m(){return{getDeviceSessionState:u,setDeviceSessionState:R,getAppAndVersion:N,openApp:O,closeApp:v,isDeviceOnboarded:h}}const{getDeviceSessionState:B}=c();beforeEach(()=>{vi.resetAllMocks(),h.mockReturnValue(!0)}),describe("without overriding `extractDependencies`",()=>{it("should end if the required application is opened",()=>new Promise((r,o)=>{B.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"Bitcoin",version:"1.0.0"},installedApps:[],deviceModelId:U.NANO_X,isSecureConnectionAllowed:!1}),D([{currentApp:"Bitcoin",currentAppVersion:"0.0.0"}]);const n=new A({input:{appName:"Bitcoin"}}),i=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:S.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Completed,output:void 0}];d(n,i,c(),{onDone:r,onError:o})}))}),describe("success cases",()=>{it("should end in a success if the app is already opened",()=>new Promise((r,o)=>{u.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"Bitcoin",version:"1.0.0"}}),D([{currentApp:"Bitcoin",currentAppVersion:"1.0.0"}]);const n=new A({input:{appName:"Bitcoin",unlockTimeout:void 0}});vi.spyOn(n,"extractDependencies").mockReturnValue(m());const i=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:S.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Completed,output:void 0}];d(n,i,c(),{onDone:r,onError:o})})),it("should end in a success if the dashboard is open and open app succeeds",()=>new Promise((r,o)=>{u.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"BOLOS",version:"0.0.0"}}),D([{currentApp:"Bitcoin",currentAppVersion:"1.0.0"}]),O.mockResolvedValue(l({data:void 0}));const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(m());const i=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:S.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Completed,output:void 0}],{observable:V}=d(n,i,c(),{onDone:r,onError:o});T(V).then(()=>{expect(R).toHaveBeenCalledWith({deviceStatus:a.CONNECTED,sessionStateType:p.ReadyWithoutSecureChannel,currentApp:{name:"Bitcoin",version:"1.0.0"}})})})),it("should end in a success if disconnection occurs while open app succeeds",()=>new Promise((r,o)=>{u.mockReturnValue(l({data:{sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"BOLOS",version:"0.0.0"}}})),N.mockResolvedValue(l({data:{name:"BOLOS",version:"0.0.0"}})),D([{currentApp:"BOLOS",currentAppVersion:"0.0.0"},{currentApp:"Bitcoin",currentAppVersion:"0.0.0"}]),O.mockRejectedValue(new k);const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(m());const i=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:S.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp,step:s.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Completed,output:void 0}];d(n,i,c(),{onDone:r,onError:o})})),it("should end in a success if another app is open, close app succeeds and open app succeeds",()=>new Promise((r,o)=>{u.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"AnotherApp",version:"0.0.0"}}),D([{currentApp:"AnotherApp",currentAppVersion:"0.0.0"},{currentApp:"Bitcoin",currentAppVersion:"1.0.0"}]),v.mockResolvedValue(l({data:void 0})),O.mockResolvedValue(l({data:void 0}));const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(m());const i=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:S.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp,step:s.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Completed,output:void 0}],{observable:V}=d(n,i,c(),{onDone:r,onError:o});T(V).then(()=>{expect(R).toHaveBeenCalledWith({currentApp:{name:"Bitcoin",version:"1.0.0"},deviceStatus:a.CONNECTED,sessionStateType:p.ReadyWithoutSecureChannel})})}))}),describe("errors cases",()=>{it("should end in an error if the device is not onboarded",()=>new Promise((r,o)=>{u.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}}),h.mockReturnValue(!1);const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(m());const i=[{error:new w,status:e.Error}];d(n,i,c(),{onDone:r,onError:o})})),it("should end in an error if the device is locked",()=>new Promise((r,o)=>{u.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}}),D([new y]);const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(m());const i=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:S.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Error,error:new y}];d(n,i,c(),{onDone:r,onError:o})})),it("should end in an error if getAppAndVersion returns an error",()=>new Promise((r,o)=>{u.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}}),D([new C("mocked error")]);const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(m());const i=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:S.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Error,error:new C("mocked error")}];d(n,i,c(),{onDone:r,onError:o})})),it("should end in an error if the dashboard is open and open app returns an error",()=>new Promise((r,o)=>{u.mockReturnValue(l({data:{sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"BOLOS",version:"0.0.0"}}})),N.mockResolvedValue(l({data:{name:"BOLOS",version:"0.0.0"}})),D([{currentApp:"BOLOS",currentAppVersion:"0.0.0"}]),O.mockResolvedValue(l({error:new C("mocked error")}));const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(m());const i=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:S.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp,step:s.ONBOARD_CHECK}},{status:e.Error,error:new C("mocked error")}];d(n,i,c(),{onDone:r,onError:o})})),it("should end in a success if disconnection occurs while open app failed",()=>new Promise((r,o)=>{u.mockReturnValue(l({data:{sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"BOLOS",version:"0.0.0"}}})),N.mockResolvedValue(l({data:{name:"BOLOS",version:"0.0.0"}})),D([{currentApp:"BOLOS",currentAppVersion:"0.0.0"},{currentApp:"BOLOS",currentAppVersion:"0.0.0"}]),O.mockRejectedValue(new k);const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(m());const i=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:S.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp,step:s.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Error,error:new k}];d(n,i,c(),{onDone:r,onError:o})})),it("should end in an error if another app is open, and close app returns an error",()=>new Promise((r,o)=>{u.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"AnotherApp",version:"0.0.0"}}),D([{currentApp:"AnotherApp",currentAppVersion:"0.0.0"}]),v.mockResolvedValue(l({error:new C("mocked error")}));const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(m());const i=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:S.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Error,error:new C("mocked error")}];d(n,i,c(),{onDone:r,onError:o})})),it("should end in an error if another app is open, close app succeeds but open app returns an error",()=>new Promise((r,o)=>{u.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"AnotherApp",version:"0.0.0"}}),D([{currentApp:"AnotherApp",currentAppVersion:"0.0.0"}]),v.mockResolvedValue(l({data:void 0})),O.mockResolvedValue(l({error:new C("mocked error")}));const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(m());const i=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:S.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp,step:s.ONBOARD_CHECK}},{status:e.Error,error:new C("mocked error")}];d(n,i,c(),{onDone:r,onError:o})})),it("should end in an error if getAppAndVersion actor throws an error",()=>new Promise((r,o)=>{u.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}}),D([new E("Unknown error")]);const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(m());const i=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:S.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Error,error:new E("Unknown error")}];d(n,i,c(),{onDone:r,onError:o})})),it("should end in an error if openApp actor throws an error",()=>new Promise((r,o)=>{u.mockReturnValue(l({data:{sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"BOLOS",version:"0.0.0"}}})),D([{currentApp:"BOLOS",currentAppVersion:"0.0.0"}]),O.mockImplementation(()=>{throw new E("Unknown error")});const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(m());const i=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:S.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp,step:s.ONBOARD_CHECK}},{status:e.Error,error:new E("Unknown error")}];d(n,i,c(),{onDone:r,onError:o})})),it("should end in an error if closeApp actor throws an error",()=>new Promise((r,o)=>{u.mockReturnValue(l({data:{sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"BOLOS",version:"0.0.0"}}})),D([{currentApp:"anApp",currentAppVersion:"0.0.0"}]),v.mockImplementation(()=>{throw new E("Unknown error")});const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(m());const i=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:S.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Error,error:new E("Unknown error")}];d(n,i,c(),{onDone:r,onError:o})})),it("should emit a stopped state if the action is cancelled",()=>new Promise((r,o)=>{u.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"AnotherApp",version:"0.0.0"}}),D([{currentApp:"AnotherApp",currentAppVersion:"0.0.0"}]);const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(m());const i=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:S.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:s.ONBOARD_CHECK}},{status:e.Stopped}],{cancel:V}=d(n,i,c(),{onDone:r,onError:o});V()}))})});
1
+ import{lastValueFrom as k}from"rxjs";import{InvalidStatusWordError as C}from"../../../command/Errors";import{CommandResultFactory as S}from"../../../command/model/CommandResult";import{DeviceModelId as B}from"../../../device/DeviceModel";import{DeviceStatus as a}from"../../../device/DeviceStatus";import{makeDeviceActionInternalApiMock as c}from"../../../device-action/__test-utils__/makeInternalApi";import{setupGetDeviceStatusMock as u}from"../../../device-action/__test-utils__/setupTestMachine";import{testDeviceActionStates as d}from"../../../device-action/__test-utils__/testDeviceActionStates";import{DeviceActionStatus as e}from"../../../device-action/model/DeviceActionState";import{UserInteractionRequired as t}from"../../../device-action/model/UserInteractionRequired";import{DeviceLockedError as I,DeviceNotOnboardedError as U,UnknownDAError as E}from"../../../device-action/os/Errors";import{getDeviceStatusDAStateStep as r}from"../../../device-action/os/GetDeviceStatus/types";import{DeviceSessionStateType as p}from"../../../device-session/DeviceSessionState";import{DeviceDisconnectedWhileSendingError as h}from"../../../transport/model/Errors";import{OpenAppDeviceAction as A}from"./OpenAppDeviceAction";import{openAppDAStateStep as m}from"./types";vi.mock("@api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction");describe("OpenAppDeviceAction",()=>{const V=vi.fn(),O=vi.fn(),v=vi.fn(),l=vi.fn(),R=vi.fn();function D(){return{getDeviceSessionState:l,setDeviceSessionState:R,openApp:O,closeApp:v}}const{getDeviceSessionState:T}=c();beforeEach(()=>{vi.resetAllMocks()}),describe("without overriding `extractDependencies`",()=>{it("should end if the required application is opened",()=>new Promise((o,i)=>{T.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"Bitcoin",version:"1.0.0"},installedApps:[],deviceModelId:B.NANO_X,isSecureConnectionAllowed:!1}),u([{currentApp:"Bitcoin",currentAppVersion:"0.0.0"}]);const n=new A({input:{appName:"Bitcoin"}}),s=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:m.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Completed,output:void 0}];d(n,s,c(),{onDone:o,onError:i})}))}),describe("success cases",()=>{it("should end in a success if the app is already opened",()=>new Promise((o,i)=>{l.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"Bitcoin",version:"1.0.0"}}),u([{currentApp:"Bitcoin",currentAppVersion:"1.0.0"}]);const n=new A({input:{appName:"Bitcoin",unlockTimeout:void 0}});vi.spyOn(n,"extractDependencies").mockReturnValue(D());const s=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:m.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Completed,output:void 0}];d(n,s,c(),{onDone:o,onError:i})})),it("should end in a success if the dashboard is open and open app succeeds",()=>new Promise((o,i)=>{l.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"BOLOS",version:"0.0.0"}}),u([{currentApp:"Bitcoin",currentAppVersion:"1.0.0"}]),O.mockResolvedValue(S({data:void 0}));const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(D());const s=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:m.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Completed,output:void 0}],{observable:N}=d(n,s,c(),{onDone:o,onError:i});k(N).then(()=>{expect(R).toHaveBeenCalledWith({deviceStatus:a.CONNECTED,sessionStateType:p.ReadyWithoutSecureChannel,currentApp:{name:"Bitcoin",version:"1.0.0"}})})})),it("should end in a success if disconnection occurs while open app succeeds",()=>new Promise((o,i)=>{l.mockReturnValue(S({data:{sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"BOLOS",version:"0.0.0"}}})),V.mockResolvedValue(S({data:{name:"BOLOS",version:"0.0.0"}})),u([{currentApp:"BOLOS",currentAppVersion:"0.0.0"},{currentApp:"Bitcoin",currentAppVersion:"0.0.0"}]),O.mockRejectedValue(new h);const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(D());const s=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:m.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp,step:r.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Completed,output:void 0}];d(n,s,c(),{onDone:o,onError:i})})),it("should end in a success if another app is open, close app succeeds and open app succeeds",()=>new Promise((o,i)=>{l.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"AnotherApp",version:"0.0.0"}}),u([{currentApp:"AnotherApp",currentAppVersion:"0.0.0"},{currentApp:"Bitcoin",currentAppVersion:"1.0.0"}]),v.mockResolvedValue(S({data:void 0})),O.mockResolvedValue(S({data:void 0}));const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(D());const s=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:m.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp,step:r.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Completed,output:void 0}],{observable:N}=d(n,s,c(),{onDone:o,onError:i});k(N).then(()=>{expect(R).toHaveBeenCalledWith({currentApp:{name:"Bitcoin",version:"1.0.0"},deviceStatus:a.CONNECTED,sessionStateType:p.ReadyWithoutSecureChannel})})}))}),describe("errors cases",()=>{it("should end in an error if the device is not onboarded",()=>new Promise((o,i)=>{T.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"},installedApps:[],deviceModelId:B.NANO_X,isSecureConnectionAllowed:!1}),u([new U]);const n=new A({input:{appName:"Bitcoin"}}),s=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:m.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{error:new U,status:e.Error}];d(n,s,c(),{onDone:o,onError:i})})),it("should end in an error if the device is locked",()=>new Promise((o,i)=>{l.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.LOCKED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}}),u([new I]);const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(D());const s=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:m.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Error,error:new I}];d(n,s,c(),{onDone:o,onError:i})})),it("should end in an error if getAppAndVersion returns an error",()=>new Promise((o,i)=>{l.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}}),u([new C("mocked error")]);const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(D());const s=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:m.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Error,error:new C("mocked error")}];d(n,s,c(),{onDone:o,onError:i})})),it("should end in an error if the dashboard is open and open app returns an error",()=>new Promise((o,i)=>{l.mockReturnValue(S({data:{sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"BOLOS",version:"0.0.0"}}})),V.mockResolvedValue(S({data:{name:"BOLOS",version:"0.0.0"}})),u([{currentApp:"BOLOS",currentAppVersion:"0.0.0"}]),O.mockResolvedValue(S({error:new C("mocked error")}));const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(D());const s=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:m.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp,step:r.ONBOARD_CHECK}},{status:e.Error,error:new C("mocked error")}];d(n,s,c(),{onDone:o,onError:i})})),it("should end in a success if disconnection occurs while open app failed",()=>new Promise((o,i)=>{l.mockReturnValue(S({data:{sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"BOLOS",version:"0.0.0"}}})),V.mockResolvedValue(S({data:{name:"BOLOS",version:"0.0.0"}})),u([{currentApp:"BOLOS",currentAppVersion:"0.0.0"},{currentApp:"BOLOS",currentAppVersion:"0.0.0"}]),O.mockRejectedValue(new h);const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(D());const s=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:m.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp,step:r.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Error,error:new h}];d(n,s,c(),{onDone:o,onError:i})})),it("should end in an error if another app is open, and close app returns an error",()=>new Promise((o,i)=>{l.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"AnotherApp",version:"0.0.0"}}),u([{currentApp:"AnotherApp",currentAppVersion:"0.0.0"}]),v.mockResolvedValue(S({error:new C("mocked error")}));const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(D());const s=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:m.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Error,error:new C("mocked error")}];d(n,s,c(),{onDone:o,onError:i})})),it("should end in an error if another app is open, close app succeeds but open app returns an error",()=>new Promise((o,i)=>{l.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"AnotherApp",version:"0.0.0"}}),u([{currentApp:"AnotherApp",currentAppVersion:"0.0.0"}]),v.mockResolvedValue(S({data:void 0})),O.mockResolvedValue(S({error:new C("mocked error")}));const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(D());const s=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:m.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp,step:r.ONBOARD_CHECK}},{status:e.Error,error:new C("mocked error")}];d(n,s,c(),{onDone:o,onError:i})})),it("should end in an error if getAppAndVersion actor throws an error",()=>new Promise((o,i)=>{l.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"mockedCurrentApp",version:"1.0.0"}}),u([new E("Unknown error")]);const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(D());const s=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:m.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Error,error:new E("Unknown error")}];d(n,s,c(),{onDone:o,onError:i})})),it("should end in an error if openApp actor throws an error",()=>new Promise((o,i)=>{l.mockReturnValue(S({data:{sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"BOLOS",version:"0.0.0"}}})),u([{currentApp:"BOLOS",currentAppVersion:"0.0.0"}]),O.mockImplementation(()=>{throw new E("Unknown error")});const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(D());const s=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:m.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp,step:r.ONBOARD_CHECK}},{status:e.Error,error:new E("Unknown error")}];d(n,s,c(),{onDone:o,onError:i})})),it("should end in an error if closeApp actor throws an error",()=>new Promise((o,i)=>{l.mockReturnValue(S({data:{sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"BOLOS",version:"0.0.0"}}})),u([{currentApp:"anApp",currentAppVersion:"0.0.0"}]),v.mockImplementation(()=>{throw new E("Unknown error")});const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(D());const s=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:m.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Error,error:new E("Unknown error")}];d(n,s,c(),{onDone:o,onError:i})})),it("should emit a stopped state if the action is cancelled",()=>new Promise((o,i)=>{l.mockReturnValue({sessionStateType:p.ReadyWithoutSecureChannel,deviceStatus:a.CONNECTED,currentApp:{name:"AnotherApp",version:"0.0.0"}}),u([{currentApp:"AnotherApp",currentAppVersion:"0.0.0"}]);const n=new A({input:{appName:"Bitcoin"}});vi.spyOn(n,"extractDependencies").mockReturnValue(D());const s=[{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:m.GET_DEVICE_STATUS}},{status:e.Pending,intermediateValue:{requiredUserInteraction:t.None,step:r.ONBOARD_CHECK}},{status:e.Stopped}],{cancel:N}=d(n,s,c(),{onDone:o,onError:i});N()}))})});
2
2
  //# sourceMappingURL=OpenAppDeviceAction.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.test.ts"],
4
- "sourcesContent": ["import { lastValueFrom } from \"rxjs\";\n\nimport { InvalidStatusWordError } from \"@api/command/Errors\";\nimport { CommandResultFactory } from \"@api/command/model/CommandResult\";\nimport { DeviceModelId } from \"@api/device/DeviceModel\";\nimport { DeviceStatus } from \"@api/device/DeviceStatus\";\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { setupGetDeviceStatusMock } from \"@api/device-action/__test-utils__/setupTestMachine\";\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 { getDeviceStatusDAStateStep } from \"@api/device-action/os/GetDeviceStatus/types\";\nimport { DeviceSessionStateType } from \"@api/device-session/DeviceSessionState\";\nimport { DeviceDisconnectedWhileSendingError } from \"@api/transport/model/Errors\";\n\nimport { OpenAppDeviceAction } from \"./OpenAppDeviceAction\";\nimport {\n type OpenAppDAError,\n type OpenAppDAState,\n openAppDAStateStep,\n} from \"./types\";\n\nvi.mock(\"@api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction\");\n\ndescribe(\"OpenAppDeviceAction\", () => {\n const getAppAndVersionMock = vi.fn();\n const openAppMock = vi.fn();\n const closeAppMock = vi.fn();\n const getDeviceSessionStateMock = vi.fn();\n const setDeviceSessionStateMock = vi.fn();\n const isDeviceOnboardedMock = vi.fn();\n\n function extractDependenciesMock() {\n return {\n getDeviceSessionState: getDeviceSessionStateMock,\n setDeviceSessionState: setDeviceSessionStateMock,\n getAppAndVersion: getAppAndVersionMock,\n openApp: openAppMock,\n closeApp: closeAppMock,\n isDeviceOnboarded: isDeviceOnboardedMock,\n };\n }\n\n const { getDeviceSessionState: apiGetDeviceSessionStateMock } =\n makeDeviceActionInternalApiMock();\n\n beforeEach(() => {\n vi.resetAllMocks();\n isDeviceOnboardedMock.mockReturnValue(true);\n });\n\n describe(\"without overriding `extractDependencies`\", () => {\n it(\"should end if the required application is opened\", () =>\n new Promise<void>((resolve, reject) => {\n apiGetDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"Bitcoin\", version: \"1.0.0\" },\n installedApps: [],\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: false,\n });\n setupGetDeviceStatusMock([\n {\n currentApp: \"Bitcoin\",\n currentAppVersion: \"0.0.0\",\n },\n ]);\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get onboarding status / list apps / initial step\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // get device status / onboard check\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Completed,\n output: undefined,\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n });\n\n describe(\"success cases\", () => {\n it(\"should end in a success if the app is already opened\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"Bitcoin\", version: \"1.0.0\" },\n });\n\n setupGetDeviceStatusMock([\n {\n currentApp: \"Bitcoin\",\n currentAppVersion: \"1.0.0\",\n },\n ]);\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\", unlockTimeout: undefined },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get onboarding status / list apps / initial step\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // get app and version / onboard check / device status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Completed,\n output: undefined,\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in a success if the dashboard is open and open app succeeds\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"BOLOS\", version: \"0.0.0\" },\n });\n\n setupGetDeviceStatusMock([\n {\n currentApp: \"Bitcoin\",\n currentAppVersion: \"1.0.0\",\n },\n ]);\n\n openAppMock.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get app and version /list apps / initial step\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // get app and version / onboard check / device status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Completed,\n output: undefined,\n },\n ];\n\n const { observable } = testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n\n lastValueFrom(observable).then(() => {\n expect(setDeviceSessionStateMock).toHaveBeenCalledWith({\n deviceStatus: DeviceStatus.CONNECTED,\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n currentApp: { name: \"Bitcoin\", version: \"1.0.0\" },\n });\n });\n }));\n\n it(\"should end in a success if disconnection occurs while open app succeeds\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue(\n CommandResultFactory({\n data: {\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"BOLOS\", version: \"0.0.0\" },\n },\n }),\n );\n getAppAndVersionMock.mockResolvedValue(\n CommandResultFactory({\n data: {\n name: \"BOLOS\",\n version: \"0.0.0\",\n },\n }),\n );\n setupGetDeviceStatusMock([\n {\n currentApp: \"BOLOS\",\n currentAppVersion: \"0.0.0\",\n },\n {\n currentApp: \"Bitcoin\",\n currentAppVersion: \"0.0.0\",\n },\n ]);\n openAppMock.mockRejectedValue(\n new DeviceDisconnectedWhileSendingError(),\n );\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get onboarded status / list apps / initial step\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // get device status / onboard check\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // open app (confirm)\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // device status after open\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // final device status check\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Completed,\n output: undefined,\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in a success if another app is open, close app succeeds and open app succeeds\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"AnotherApp\", version: \"0.0.0\" },\n });\n setupGetDeviceStatusMock([\n {\n currentApp: \"AnotherApp\",\n currentAppVersion: \"0.0.0\",\n },\n { currentApp: \"Bitcoin\", currentAppVersion: \"1.0.0\" },\n ]);\n closeAppMock.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n openAppMock.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get app and version / list apps / initial step\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // get device status / close app\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // get device status / close app\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // open app (confirm)\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // get app and version\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // get app and version (final)\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Completed,\n output: undefined,\n },\n ];\n\n const { observable } = testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n\n lastValueFrom(observable).then(() => {\n expect(setDeviceSessionStateMock).toHaveBeenCalledWith({\n currentApp: { name: \"Bitcoin\", version: \"1.0.0\" },\n deviceStatus: DeviceStatus.CONNECTED,\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\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: \"mockedCurrentApp\", version: \"1.0.0\" },\n });\n isDeviceOnboardedMock.mockReturnValue(false);\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n error: new DeviceNotOnboardedError(),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\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\", () =>\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 setupGetDeviceStatusMock([new DeviceLockedError()]);\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new DeviceLockedError(),\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in an error if getAppAndVersion returns an error\", () =>\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 setupGetDeviceStatusMock([new InvalidStatusWordError(\"mocked error\")]);\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get app and version / list apps / initial\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // device status / onboard check\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new InvalidStatusWordError(\"mocked error\"),\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in an error if the dashboard is open and open app returns an error\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue(\n CommandResultFactory({\n data: {\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"BOLOS\", version: \"0.0.0\" },\n },\n }),\n );\n getAppAndVersionMock.mockResolvedValue(\n CommandResultFactory({\n data: {\n name: \"BOLOS\",\n version: \"0.0.0\",\n },\n }),\n );\n setupGetDeviceStatusMock([\n {\n currentApp: \"BOLOS\",\n currentAppVersion: \"0.0.0\",\n },\n ]);\n openAppMock.mockResolvedValue(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"mocked error\"),\n }),\n );\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get onboarded status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // device status / onboard check\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // open app (confirm)\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new InvalidStatusWordError(\"mocked error\"),\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in a success if disconnection occurs while open app failed\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue(\n CommandResultFactory({\n data: {\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"BOLOS\", version: \"0.0.0\" },\n },\n }),\n );\n getAppAndVersionMock.mockResolvedValue(\n CommandResultFactory({\n data: {\n name: \"BOLOS\",\n version: \"0.0.0\",\n },\n }),\n );\n setupGetDeviceStatusMock([\n {\n currentApp: \"BOLOS\",\n currentAppVersion: \"0.0.0\",\n },\n {\n currentApp: \"BOLOS\",\n currentAppVersion: \"0.0.0\",\n },\n ]);\n openAppMock.mockRejectedValue(\n new DeviceDisconnectedWhileSendingError(),\n );\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get onboarded status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // onboard check\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // open app (confirm)\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // device status after failure\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // final device status check\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new DeviceDisconnectedWhileSendingError() as OpenAppDAError,\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in an error if another app is open, and close app returns an error\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"AnotherApp\", version: \"0.0.0\" },\n });\n setupGetDeviceStatusMock([\n {\n currentApp: \"AnotherApp\",\n currentAppVersion: \"0.0.0\",\n },\n ]);\n closeAppMock.mockResolvedValue(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"mocked error\"),\n }),\n );\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get onboarded status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // onboard / device status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // close app\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new InvalidStatusWordError(\"mocked error\"),\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in an error if another app is open, close app succeeds but open app returns an error\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"AnotherApp\", version: \"0.0.0\" },\n });\n setupGetDeviceStatusMock([\n {\n currentApp: \"AnotherApp\",\n currentAppVersion: \"0.0.0\",\n },\n ]);\n closeAppMock.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n openAppMock.mockResolvedValue(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"mocked error\"),\n }),\n );\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get onboarded status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // onboard / device status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // close app\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // open app (confirm)\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new InvalidStatusWordError(\"mocked error\"),\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\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.CONNECTED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n });\n\n setupGetDeviceStatusMock([new UnknownDAError(\"Unknown error\")]);\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get onboarded status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // onboard / device status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDAError(\"Unknown error\"),\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in an error if openApp actor throws an error\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue(\n CommandResultFactory({\n data: {\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"BOLOS\", version: \"0.0.0\" },\n },\n }),\n );\n setupGetDeviceStatusMock([\n {\n currentApp: \"BOLOS\",\n currentAppVersion: \"0.0.0\",\n },\n ]);\n openAppMock.mockImplementation(() => {\n throw new UnknownDAError(\"Unknown error\");\n });\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get device onboarded\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // onboard / device status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // open app (confirm)\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDAError(\"Unknown error\"),\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in an error if closeApp actor throws an error\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue(\n CommandResultFactory({\n data: {\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"BOLOS\", version: \"0.0.0\" },\n },\n }),\n );\n setupGetDeviceStatusMock([\n {\n currentApp: \"anApp\",\n currentAppVersion: \"0.0.0\",\n },\n ]);\n closeAppMock.mockImplementation(() => {\n throw new UnknownDAError(\"Unknown error\");\n });\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get onboarded status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // onboard / device status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // close app\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDAError(\"Unknown error\"),\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should emit a stopped state if the action is cancelled\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"AnotherApp\", version: \"0.0.0\" },\n });\n setupGetDeviceStatusMock([\n {\n currentApp: \"AnotherApp\",\n currentAppVersion: \"0.0.0\",\n },\n ]);\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get device onboarded\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // onboard / device status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Stopped,\n },\n ];\n\n const { cancel } = testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n cancel();\n }));\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["lastValueFrom", "InvalidStatusWordError", "CommandResultFactory", "DeviceModelId", "DeviceStatus", "makeDeviceActionInternalApiMock", "setupGetDeviceStatusMock", "testDeviceActionStates", "DeviceActionStatus", "UserInteractionRequired", "DeviceLockedError", "DeviceNotOnboardedError", "UnknownDAError", "getDeviceStatusDAStateStep", "DeviceSessionStateType", "DeviceDisconnectedWhileSendingError", "OpenAppDeviceAction", "openAppDAStateStep", "getAppAndVersionMock", "openAppMock", "closeAppMock", "getDeviceSessionStateMock", "setDeviceSessionStateMock", "isDeviceOnboardedMock", "extractDependenciesMock", "apiGetDeviceSessionStateMock", "resolve", "reject", "openAppDeviceAction", "expectedStates", "observable", "cancel"]
4
+ "sourcesContent": ["import { lastValueFrom } from \"rxjs\";\n\nimport { InvalidStatusWordError } from \"@api/command/Errors\";\nimport { CommandResultFactory } from \"@api/command/model/CommandResult\";\nimport { DeviceModelId } from \"@api/device/DeviceModel\";\nimport { DeviceStatus } from \"@api/device/DeviceStatus\";\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { setupGetDeviceStatusMock } from \"@api/device-action/__test-utils__/setupTestMachine\";\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 { getDeviceStatusDAStateStep } from \"@api/device-action/os/GetDeviceStatus/types\";\nimport { DeviceSessionStateType } from \"@api/device-session/DeviceSessionState\";\nimport { DeviceDisconnectedWhileSendingError } from \"@api/transport/model/Errors\";\n\nimport { OpenAppDeviceAction } from \"./OpenAppDeviceAction\";\nimport {\n type OpenAppDAError,\n type OpenAppDAState,\n openAppDAStateStep,\n} from \"./types\";\n\nvi.mock(\"@api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction\");\n\ndescribe(\"OpenAppDeviceAction\", () => {\n const getAppAndVersionMock = vi.fn();\n const openAppMock = vi.fn();\n const closeAppMock = vi.fn();\n const getDeviceSessionStateMock = vi.fn();\n const setDeviceSessionStateMock = vi.fn();\n\n function extractDependenciesMock() {\n return {\n getDeviceSessionState: getDeviceSessionStateMock,\n setDeviceSessionState: setDeviceSessionStateMock,\n openApp: openAppMock,\n closeApp: closeAppMock,\n };\n }\n\n const { getDeviceSessionState: apiGetDeviceSessionStateMock } =\n makeDeviceActionInternalApiMock();\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"without overriding `extractDependencies`\", () => {\n it(\"should end if the required application is opened\", () =>\n new Promise<void>((resolve, reject) => {\n apiGetDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"Bitcoin\", version: \"1.0.0\" },\n installedApps: [],\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: false,\n });\n setupGetDeviceStatusMock([\n {\n currentApp: \"Bitcoin\",\n currentAppVersion: \"0.0.0\",\n },\n ]);\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get onboarding status / list apps / initial step\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // get device status / onboard check\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Completed,\n output: undefined,\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n });\n\n describe(\"success cases\", () => {\n it(\"should end in a success if the app is already opened\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"Bitcoin\", version: \"1.0.0\" },\n });\n\n setupGetDeviceStatusMock([\n {\n currentApp: \"Bitcoin\",\n currentAppVersion: \"1.0.0\",\n },\n ]);\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\", unlockTimeout: undefined },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get onboarding status / list apps / initial step\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // get app and version / onboard check / device status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Completed,\n output: undefined,\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in a success if the dashboard is open and open app succeeds\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"BOLOS\", version: \"0.0.0\" },\n });\n\n setupGetDeviceStatusMock([\n {\n currentApp: \"Bitcoin\",\n currentAppVersion: \"1.0.0\",\n },\n ]);\n\n openAppMock.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get app and version /list apps / initial step\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // get app and version / onboard check / device status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Completed,\n output: undefined,\n },\n ];\n\n const { observable } = testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n\n lastValueFrom(observable).then(() => {\n expect(setDeviceSessionStateMock).toHaveBeenCalledWith({\n deviceStatus: DeviceStatus.CONNECTED,\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n currentApp: { name: \"Bitcoin\", version: \"1.0.0\" },\n });\n });\n }));\n\n it(\"should end in a success if disconnection occurs while open app succeeds\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue(\n CommandResultFactory({\n data: {\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"BOLOS\", version: \"0.0.0\" },\n },\n }),\n );\n getAppAndVersionMock.mockResolvedValue(\n CommandResultFactory({\n data: {\n name: \"BOLOS\",\n version: \"0.0.0\",\n },\n }),\n );\n setupGetDeviceStatusMock([\n {\n currentApp: \"BOLOS\",\n currentAppVersion: \"0.0.0\",\n },\n {\n currentApp: \"Bitcoin\",\n currentAppVersion: \"0.0.0\",\n },\n ]);\n openAppMock.mockRejectedValue(\n new DeviceDisconnectedWhileSendingError(),\n );\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get onboarded status / list apps / initial step\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // get device status / onboard check\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // open app (confirm)\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // device status after open\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // final device status check\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Completed,\n output: undefined,\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in a success if another app is open, close app succeeds and open app succeeds\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"AnotherApp\", version: \"0.0.0\" },\n });\n setupGetDeviceStatusMock([\n {\n currentApp: \"AnotherApp\",\n currentAppVersion: \"0.0.0\",\n },\n { currentApp: \"Bitcoin\", currentAppVersion: \"1.0.0\" },\n ]);\n closeAppMock.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n openAppMock.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get app and version / list apps / initial step\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // get device status / close app\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // get device status / close app\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // open app (confirm)\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // get app and version\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // get app and version (final)\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Completed,\n output: undefined,\n },\n ];\n\n const { observable } = testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n\n lastValueFrom(observable).then(() => {\n expect(setDeviceSessionStateMock).toHaveBeenCalledWith({\n currentApp: { name: \"Bitcoin\", version: \"1.0.0\" },\n deviceStatus: DeviceStatus.CONNECTED,\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\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 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 setupGetDeviceStatusMock([new DeviceNotOnboardedError()]);\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n error: new DeviceNotOnboardedError(),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\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\", () =>\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 setupGetDeviceStatusMock([new DeviceLockedError()]);\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new DeviceLockedError(),\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in an error if getAppAndVersion returns an error\", () =>\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 setupGetDeviceStatusMock([new InvalidStatusWordError(\"mocked error\")]);\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get app and version / list apps / initial\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // device status / onboard check\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new InvalidStatusWordError(\"mocked error\"),\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in an error if the dashboard is open and open app returns an error\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue(\n CommandResultFactory({\n data: {\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"BOLOS\", version: \"0.0.0\" },\n },\n }),\n );\n getAppAndVersionMock.mockResolvedValue(\n CommandResultFactory({\n data: {\n name: \"BOLOS\",\n version: \"0.0.0\",\n },\n }),\n );\n setupGetDeviceStatusMock([\n {\n currentApp: \"BOLOS\",\n currentAppVersion: \"0.0.0\",\n },\n ]);\n openAppMock.mockResolvedValue(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"mocked error\"),\n }),\n );\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get onboarded status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // device status / onboard check\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // open app (confirm)\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new InvalidStatusWordError(\"mocked error\"),\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in a success if disconnection occurs while open app failed\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue(\n CommandResultFactory({\n data: {\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"BOLOS\", version: \"0.0.0\" },\n },\n }),\n );\n getAppAndVersionMock.mockResolvedValue(\n CommandResultFactory({\n data: {\n name: \"BOLOS\",\n version: \"0.0.0\",\n },\n }),\n );\n setupGetDeviceStatusMock([\n {\n currentApp: \"BOLOS\",\n currentAppVersion: \"0.0.0\",\n },\n {\n currentApp: \"BOLOS\",\n currentAppVersion: \"0.0.0\",\n },\n ]);\n openAppMock.mockRejectedValue(\n new DeviceDisconnectedWhileSendingError(),\n );\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get onboarded status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // onboard check\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // open app (confirm)\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // device status after failure\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // final device status check\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new DeviceDisconnectedWhileSendingError() as OpenAppDAError,\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in an error if another app is open, and close app returns an error\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"AnotherApp\", version: \"0.0.0\" },\n });\n setupGetDeviceStatusMock([\n {\n currentApp: \"AnotherApp\",\n currentAppVersion: \"0.0.0\",\n },\n ]);\n closeAppMock.mockResolvedValue(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"mocked error\"),\n }),\n );\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get onboarded status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // onboard / device status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // close app\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new InvalidStatusWordError(\"mocked error\"),\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in an error if another app is open, close app succeeds but open app returns an error\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"AnotherApp\", version: \"0.0.0\" },\n });\n setupGetDeviceStatusMock([\n {\n currentApp: \"AnotherApp\",\n currentAppVersion: \"0.0.0\",\n },\n ]);\n closeAppMock.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n openAppMock.mockResolvedValue(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"mocked error\"),\n }),\n );\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get onboarded status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // onboard / device status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // close app\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // open app (confirm)\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new InvalidStatusWordError(\"mocked error\"),\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\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.CONNECTED,\n currentApp: { name: \"mockedCurrentApp\", version: \"1.0.0\" },\n });\n\n setupGetDeviceStatusMock([new UnknownDAError(\"Unknown error\")]);\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get onboarded status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // onboard / device status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDAError(\"Unknown error\"),\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in an error if openApp actor throws an error\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue(\n CommandResultFactory({\n data: {\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"BOLOS\", version: \"0.0.0\" },\n },\n }),\n );\n setupGetDeviceStatusMock([\n {\n currentApp: \"BOLOS\",\n currentAppVersion: \"0.0.0\",\n },\n ]);\n openAppMock.mockImplementation(() => {\n throw new UnknownDAError(\"Unknown error\");\n });\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get device onboarded\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // onboard / device status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // open app (confirm)\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDAError(\"Unknown error\"),\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should end in an error if closeApp actor throws an error\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue(\n CommandResultFactory({\n data: {\n sessionStateType:\n DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"BOLOS\", version: \"0.0.0\" },\n },\n }),\n );\n setupGetDeviceStatusMock([\n {\n currentApp: \"anApp\",\n currentAppVersion: \"0.0.0\",\n },\n ]);\n closeAppMock.mockImplementation(() => {\n throw new UnknownDAError(\"Unknown error\");\n });\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get onboarded status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // onboard / device status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Pending, // close app\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDAError(\"Unknown error\"),\n },\n ];\n\n testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should emit a stopped state if the action is cancelled\", () =>\n new Promise<void>((resolve, reject) => {\n getDeviceSessionStateMock.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n currentApp: { name: \"AnotherApp\", version: \"0.0.0\" },\n });\n setupGetDeviceStatusMock([\n {\n currentApp: \"AnotherApp\",\n currentAppVersion: \"0.0.0\",\n },\n ]);\n\n const openAppDeviceAction = new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n });\n vi.spyOn(openAppDeviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<OpenAppDAState> = [\n {\n status: DeviceActionStatus.Pending, // get device onboarded\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: openAppDAStateStep.GET_DEVICE_STATUS,\n },\n },\n {\n status: DeviceActionStatus.Pending, // onboard / device status\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: getDeviceStatusDAStateStep.ONBOARD_CHECK,\n },\n },\n {\n status: DeviceActionStatus.Stopped,\n },\n ];\n\n const { cancel } = testDeviceActionStates(\n openAppDeviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n cancel();\n }));\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["lastValueFrom", "InvalidStatusWordError", "CommandResultFactory", "DeviceModelId", "DeviceStatus", "makeDeviceActionInternalApiMock", "setupGetDeviceStatusMock", "testDeviceActionStates", "DeviceActionStatus", "UserInteractionRequired", "DeviceLockedError", "DeviceNotOnboardedError", "UnknownDAError", "getDeviceStatusDAStateStep", "DeviceSessionStateType", "DeviceDisconnectedWhileSendingError", "OpenAppDeviceAction", "openAppDAStateStep", "getAppAndVersionMock", "openAppMock", "closeAppMock", "getDeviceSessionStateMock", "setDeviceSessionStateMock", "extractDependenciesMock", "apiGetDeviceSessionStateMock", "resolve", "reject", "openAppDeviceAction", "expectedStates", "observable", "cancel"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ import{Left as V,Right as D}from"purify-ts";import{first as F,from as v,interval as k,map as S,switchMap as E}from"rxjs";import{timeout as f}from"rxjs/operators";import{assign as r,fromObservable as y,fromPromise as g,setup as W}from"xstate";import{isSuccessCommandResult as p}from"../../../command/model/CommandResult";import{GetAppAndVersionCommand as d}from"../../../command/os/GetAppAndVersionCommand";import{UserInteractionRequired as i}from"../../../device-action/model/UserInteractionRequired";import{DEFAULT_UNLOCK_TIMEOUT_MS as I}from"../../../device-action/os/Const";import{DeviceLockedError as h}from"../../../device-action/os/Errors";import{XStateDeviceAction as x}from"../../../device-action/xstate-utils/XStateDeviceAction";import{LEDGER_OS_NAME as _}from"../../../utils/AppName";import{waitForAppAndVersionDAStateStep as a}from"./types";const l=t=>!p(t)&&"errorCode"in t.error&&t.error.errorCode==="5515",C=t=>!p(t)&&"errorCode"in t.error&&t.error.errorCode==="6e00";class K extends x{makeStateMachine(n){const{getAppAndVersion:s,waitForDeviceUnlock:A}=this.extractDependencies(n),o=this.input.unlockTimeout??I;return W({types:{input:{unlockTimeout:o},context:{},output:{}},actors:{getAppAndVersion:g(s),waitForDeviceUnlock:y(A)},guards:{isDeviceLocked:({context:e})=>e._internalState.locked,hasError:({context:e})=>e._internalState.error!==null},actions:{assignErrorDeviceLocked:r({_internalState:e=>({...e.context._internalState,error:new h})}),assignErrorFromEvent:r({_internalState:e=>({...e.context._internalState,error:e.event.error})})}}).createMachine({id:"WaitForAppAndVersionDeviceAction",initial:"GetAppAndVersion",context:e=>({input:{unlockTimeout:e.input.unlockTimeout},intermediateValue:{requiredUserInteraction:i.None,step:a.GET_APP_AND_VERSION},_internalState:{appAndVersion:null,locked:!1,error:null}}),states:{GetAppAndVersion:{entry:r({intermediateValue:e=>({...e.context.intermediateValue,step:a.GET_APP_AND_VERSION,requiredUserInteraction:i.None})}),invoke:{src:"getAppAndVersion",onDone:{target:"CheckGetAppAndVersionResult",actions:r({_internalState:e=>p(e.event.output)?{...e.context._internalState,locked:!1,appAndVersion:e.event.output.data}:l(e.event.output)?{...e.context._internalState,locked:!0}:C(e.event.output)?{...e.context._internalState,locked:!1,appAndVersion:{name:_,version:"0.0.0"}}:{...e.context._internalState,error:e.event.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},CheckGetAppAndVersionResult:{always:[{guard:"hasError",target:"Error"},{guard:"isDeviceLocked",target:"AwaitingForDeviceUnlocked"},{target:"Success"}]},AwaitingForDeviceUnlocked:{entry:r({intermediateValue:e=>({...e.context.intermediateValue,requiredUserInteraction:i.UnlockDevice,step:a.UNLOCK_DEVICE})}),invoke:{id:"AwaitingForDeviceUnlocked",src:"waitForDeviceUnlock",input:e=>({unlockTimeout:o}),onDone:{target:"GetAppAndVersion",actions:r({_internalState:e=>({...e.context._internalState,locked:!1})})},onError:{target:"Error",actions:"assignErrorDeviceLocked"}}},Success:{type:"final"},Error:{type:"final"}},output:e=>{const{context:u}=e,{error:c,appAndVersion:m}=u._internalState;return c?V(c):D(m)}})}extractDependencies(n){return{getAppAndVersion:()=>n.sendCommand(new d),waitForDeviceUnlock:({input:o})=>k(1e3).pipe(E(()=>v(n.sendCommand(new d))),F(e=>!l(e)),S(()=>{}),f(o.unlockTimeout))}}}export{K as WaitForAppAndVersionDeviceAction};
2
+ //# sourceMappingURL=WaitForAppAndVersionDeviceAction.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/api/device-action/os/WaitForAppAndVersion/WaitForAppAndVersionDeviceAction.ts"],
4
+ "sourcesContent": ["import { Left, Right } from \"purify-ts\";\nimport { first, from, interval, map, type Observable, switchMap } 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 { 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 { DeviceLockedError } 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 { LEDGER_OS_NAME } from \"@api/utils/AppName\";\n\nimport {\n type WaitForAppAndVersionDAError,\n type WaitForAppAndVersionDAInput,\n type WaitForAppAndVersionDAIntermediateValue,\n type WaitForAppAndVersionDAOutput,\n waitForAppAndVersionDAStateStep,\n} from \"./types\";\n\ntype WaitForAppAndVersionMachineInternalState = {\n readonly appAndVersion: WaitForAppAndVersionDAOutput | null;\n readonly locked: boolean;\n readonly error: WaitForAppAndVersionDAError | null;\n};\n\nexport type MachineDependencies = {\n readonly getAppAndVersion: () => Promise<GetAppAndVersionCommandResult>;\n readonly waitForDeviceUnlock: (args: {\n input: { unlockTimeout: number };\n }) => Observable<void>;\n};\n\nexport type ExtractMachineDependencies = (\n internalApi: InternalApi,\n) => MachineDependencies;\n\nconst isLocked = (output: GetAppAndVersionCommandResult): boolean =>\n !isSuccessCommandResult(output) &&\n \"errorCode\" in output.error &&\n output.error.errorCode === \"5515\";\n\nconst isClaNotSupported = (output: GetAppAndVersionCommandResult): boolean =>\n !isSuccessCommandResult(output) &&\n \"errorCode\" in output.error &&\n output.error.errorCode === \"6e00\";\n\nexport class WaitForAppAndVersionDeviceAction extends XStateDeviceAction<\n WaitForAppAndVersionDAOutput,\n WaitForAppAndVersionDAInput,\n WaitForAppAndVersionDAError,\n WaitForAppAndVersionDAIntermediateValue,\n WaitForAppAndVersionMachineInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n WaitForAppAndVersionDAOutput,\n WaitForAppAndVersionDAInput,\n WaitForAppAndVersionDAError,\n WaitForAppAndVersionDAIntermediateValue,\n WaitForAppAndVersionMachineInternalState\n > {\n type types = StateMachineTypes<\n WaitForAppAndVersionDAOutput,\n WaitForAppAndVersionDAInput,\n WaitForAppAndVersionDAError,\n WaitForAppAndVersionDAIntermediateValue,\n WaitForAppAndVersionMachineInternalState\n >;\n\n const { getAppAndVersion, waitForDeviceUnlock } =\n this.extractDependencies(internalApi);\n\n const unlockTimeout = this.input.unlockTimeout ?? DEFAULT_UNLOCK_TIMEOUT_MS;\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 waitForDeviceUnlock: fromObservable(waitForDeviceUnlock),\n },\n guards: {\n isDeviceLocked: ({ context }) => context._internalState.locked,\n hasError: ({ context }) => context._internalState.error !== null,\n },\n actions: {\n assignErrorDeviceLocked: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new DeviceLockedError(),\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 },\n }).createMachine({\n id: \"WaitForAppAndVersionDeviceAction\",\n initial: \"GetAppAndVersion\",\n context: (_) => ({\n input: {\n unlockTimeout: _.input.unlockTimeout,\n },\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: waitForAppAndVersionDAStateStep.GET_APP_AND_VERSION,\n },\n _internalState: {\n appAndVersion: null,\n locked: false,\n error: null,\n },\n }),\n states: {\n GetAppAndVersion: {\n entry: assign({\n intermediateValue: (_) => ({\n ..._.context.intermediateValue,\n step: waitForAppAndVersionDAStateStep.GET_APP_AND_VERSION,\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n src: \"getAppAndVersion\",\n onDone: {\n target: \"CheckGetAppAndVersionResult\",\n actions: assign({\n _internalState: (_) => {\n if (isSuccessCommandResult(_.event.output)) {\n return {\n ..._.context._internalState,\n locked: false,\n appAndVersion: _.event.output.data,\n };\n }\n if (isLocked(_.event.output)) {\n return {\n ..._.context._internalState,\n locked: true,\n };\n }\n if (isClaNotSupported(_.event.output)) {\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 appAndVersion: {\n name: LEDGER_OS_NAME,\n version: \"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 CheckGetAppAndVersionResult: {\n always: [\n {\n guard: \"hasError\",\n target: \"Error\",\n },\n {\n guard: \"isDeviceLocked\",\n target: \"AwaitingForDeviceUnlocked\",\n },\n {\n target: \"Success\",\n },\n ],\n },\n AwaitingForDeviceUnlocked: {\n entry: assign({\n intermediateValue: (_) => ({\n ..._.context.intermediateValue,\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n step: waitForAppAndVersionDAStateStep.UNLOCK_DEVICE,\n }),\n }),\n invoke: {\n id: \"AwaitingForDeviceUnlocked\",\n src: \"waitForDeviceUnlock\",\n input: (_) => ({\n unlockTimeout,\n }),\n onDone: {\n target: \"GetAppAndVersion\",\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 const { context } = args;\n const { error, appAndVersion } = context._internalState;\n if (error) {\n return Left(error);\n }\n return Right<WaitForAppAndVersionDAOutput>(appAndVersion!);\n },\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppAndVersion = () =>\n internalApi.sendCommand(new GetAppAndVersionCommand());\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 first((output) => !isLocked(output)),\n map(() => undefined),\n timeout(input.unlockTimeout),\n );\n\n return {\n getAppAndVersion,\n waitForDeviceUnlock,\n };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Left", "Right", "first", "from", "interval", "map", "switchMap", "timeout", "assign", "fromObservable", "fromPromise", "setup", "isSuccessCommandResult", "GetAppAndVersionCommand", "UserInteractionRequired", "DEFAULT_UNLOCK_TIMEOUT_MS", "DeviceLockedError", "XStateDeviceAction", "LEDGER_OS_NAME", "waitForAppAndVersionDAStateStep", "isLocked", "output", "isClaNotSupported", "WaitForAppAndVersionDeviceAction", "internalApi", "getAppAndVersion", "waitForDeviceUnlock", "unlockTimeout", "context", "_", "args", "error", "appAndVersion", "input"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{of as R,throwError as E}from"rxjs";import{CommandResultFactory as A}from"../../../command/model/CommandResult";import{GLOBAL_ERRORS as m,GlobalCommandError as l}from"../../../command/utils/GlobalCommandError";import{makeDeviceActionInternalApiMock as a}from"../../../device-action/__test-utils__/makeInternalApi";import{testDeviceActionStates as d}from"../../../device-action/__test-utils__/testDeviceActionStates";import{DeviceActionStatus as i}from"../../../device-action/model/DeviceActionState";import{UserInteractionRequired as S}from"../../../device-action/model/UserInteractionRequired";import{DeviceLockedError as v,UnknownDAError as k}from"../../../device-action/os/Errors";import{waitForAppAndVersionDAStateStep as f}from"./types";import{WaitForAppAndVersionDeviceAction as p}from"./WaitForAppAndVersionDeviceAction";const V=(r,u)=>A({data:{name:r,version:u}}),D=()=>A({error:new l({...m[5515],errorCode:"5515"})}),O=()=>A({error:new l({...m["6e00"],errorCode:"6e00"})}),c=()=>({intermediateValue:{requiredUserInteraction:S.None,step:f.GET_APP_AND_VERSION},status:i.Pending}),w=()=>({intermediateValue:{requiredUserInteraction:S.UnlockDevice,step:f.UNLOCK_DEVICE},status:i.Pending});describe("WaitForAppAndVersionDeviceAction",()=>{const r=vi.fn(),u=vi.fn();function s(){return{getAppAndVersion:r,waitForDeviceUnlock:u}}beforeEach(()=>{vi.resetAllMocks()}),it("should succeed on the first call when the device is already unlocked",()=>new Promise((t,n)=>{r.mockResolvedValue(V("BOLOS","1.0.0"));const e=new p({input:{unlockTimeout:500}});vi.spyOn(e,"extractDependencies").mockReturnValue(s());const o=[c(),{status:i.Completed,output:{name:"BOLOS",version:"1.0.0"}}];d(e,o,a(),{onDone:t,onError:n})})),it("should wait for the device to be unlocked then succeed",()=>new Promise((t,n)=>{r.mockResolvedValueOnce(D()).mockResolvedValueOnce(V("Bitcoin","2.1.0")),u.mockReturnValue(R(void 0));const e=new p({input:{unlockTimeout:500}});vi.spyOn(e,"extractDependencies").mockReturnValue(s());const o=[c(),w(),c(),{status:i.Completed,output:{name:"Bitcoin",version:"2.1.0"}}];d(e,o,a(),{onDone:t,onError:n})})),it("should consider the device on the dashboard of an old firmware when CLA is not supported",()=>new Promise((t,n)=>{r.mockResolvedValue(O());const e=new p({input:{unlockTimeout:500}});vi.spyOn(e,"extractDependencies").mockReturnValue(s());const o=[c(),{status:i.Completed,output:{name:"BOLOS",version:"0.0.0"}}];d(e,o,a(),{onDone:t,onError:n})})),it("should end in an error if the device stays locked until the unlock timeout",()=>new Promise((t,n)=>{r.mockResolvedValue(D()),u.mockReturnValue(E(()=>new v));const e=new p({input:{unlockTimeout:500}});vi.spyOn(e,"extractDependencies").mockReturnValue(s());const o=[c(),w(),{status:i.Error,error:new v}];d(e,o,a(),{onDone:t,onError:n})})),it("should end in an error if the GetAppAndVersion command fails with a non-locked error",()=>new Promise((t,n)=>{const e=new l({...m[5501],errorCode:"5501"});r.mockResolvedValue(A({error:e}));const o=new p({input:{unlockTimeout:500}});vi.spyOn(o,"extractDependencies").mockReturnValue(s());const h=[c(),{status:i.Error,error:e}];d(o,h,a(),{onDone:t,onError:n})})),it("should end in an error if the getAppAndVersion actor throws an error",()=>new Promise((t,n)=>{r.mockImplementation(()=>{throw new k("error")});const e=new p({input:{unlockTimeout:500}});vi.spyOn(e,"extractDependencies").mockReturnValue(s());const o=[c(),{status:i.Error,error:new k("error")}];d(e,o,a(),{onDone:t,onError:n})}))});
2
+ //# sourceMappingURL=WaitForAppAndVersionDeviceAction.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/api/device-action/os/WaitForAppAndVersion/WaitForAppAndVersionDeviceAction.test.ts"],
4
+ "sourcesContent": ["import { of, throwError } from \"rxjs\";\n\nimport { CommandResultFactory } from \"@api/command/model/CommandResult\";\nimport {\n GLOBAL_ERRORS,\n GlobalCommandError,\n} from \"@api/command/utils/GlobalCommandError\";\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 UnknownDAError,\n} from \"@api/device-action/os/Errors\";\n\nimport {\n type WaitForAppAndVersionDAState,\n waitForAppAndVersionDAStateStep,\n} from \"./types\";\nimport { WaitForAppAndVersionDeviceAction } from \"./WaitForAppAndVersionDeviceAction\";\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 claNotSupportedErrorResult = () =>\n CommandResultFactory({\n error: new GlobalCommandError({\n ...GLOBAL_ERRORS[\"6e00\"],\n errorCode: \"6e00\",\n }),\n });\n\nconst getAppAndVersionPendingState = (): WaitForAppAndVersionDAState => ({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: waitForAppAndVersionDAStateStep.GET_APP_AND_VERSION,\n },\n status: DeviceActionStatus.Pending,\n});\n\nconst unlockRequestedPendingState = (): WaitForAppAndVersionDAState => ({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n step: waitForAppAndVersionDAStateStep.UNLOCK_DEVICE,\n },\n status: DeviceActionStatus.Pending,\n});\n\ndescribe(\"WaitForAppAndVersionDeviceAction\", () => {\n const getAppAndVersionMock = vi.fn();\n const waitForDeviceUnlockMock = vi.fn();\n\n function extractDependenciesMock() {\n return {\n getAppAndVersion: getAppAndVersionMock,\n waitForDeviceUnlock: waitForDeviceUnlockMock,\n };\n }\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n it(\"should succeed on the first call when the device is already unlocked\", () =>\n new Promise<void>((resolve, reject) => {\n getAppAndVersionMock.mockResolvedValue(\n appAndVersionResult(\"BOLOS\", \"1.0.0\"),\n );\n\n const deviceAction = new WaitForAppAndVersionDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<WaitForAppAndVersionDAState> = [\n getAppAndVersionPendingState(),\n {\n status: DeviceActionStatus.Completed,\n output: {\n name: \"BOLOS\",\n version: \"1.0.0\",\n },\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should wait for the device to be unlocked then succeed\", () =>\n new Promise<void>((resolve, reject) => {\n getAppAndVersionMock\n .mockResolvedValueOnce(lockedErrorResult())\n .mockResolvedValueOnce(appAndVersionResult(\"Bitcoin\", \"2.1.0\"));\n\n waitForDeviceUnlockMock.mockReturnValue(of(undefined));\n\n const deviceAction = new WaitForAppAndVersionDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<WaitForAppAndVersionDAState> = [\n getAppAndVersionPendingState(),\n unlockRequestedPendingState(),\n getAppAndVersionPendingState(),\n {\n status: DeviceActionStatus.Completed,\n output: {\n name: \"Bitcoin\",\n version: \"2.1.0\",\n },\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should consider the device on the dashboard of an old firmware when CLA is not supported\", () =>\n new Promise<void>((resolve, reject) => {\n getAppAndVersionMock.mockResolvedValue(claNotSupportedErrorResult());\n\n const deviceAction = new WaitForAppAndVersionDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<WaitForAppAndVersionDAState> = [\n getAppAndVersionPendingState(),\n {\n status: DeviceActionStatus.Completed,\n output: {\n name: \"BOLOS\",\n version: \"0.0.0\",\n },\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\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 stays locked until the unlock timeout\", () =>\n new Promise<void>((resolve, reject) => {\n getAppAndVersionMock.mockResolvedValue(lockedErrorResult());\n\n waitForDeviceUnlockMock.mockReturnValue(\n throwError(() => new DeviceLockedError()),\n );\n\n const deviceAction = new WaitForAppAndVersionDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<WaitForAppAndVersionDAState> = [\n getAppAndVersionPendingState(),\n unlockRequestedPendingState(),\n {\n status: DeviceActionStatus.Error,\n error: new DeviceLockedError(),\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\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 with a non-locked error\", () =>\n new Promise<void>((resolve, reject) => {\n const error = new GlobalCommandError({\n ...GLOBAL_ERRORS[\"5501\"],\n errorCode: \"5501\",\n });\n\n getAppAndVersionMock.mockResolvedValue(CommandResultFactory({ error }));\n\n const deviceAction = new WaitForAppAndVersionDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<WaitForAppAndVersionDAState> = [\n getAppAndVersionPendingState(),\n {\n status: DeviceActionStatus.Error,\n error,\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\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 actor throws an error\", () =>\n new Promise<void>((resolve, reject) => {\n getAppAndVersionMock.mockImplementation(() => {\n throw new UnknownDAError(\"error\");\n });\n\n const deviceAction = new WaitForAppAndVersionDeviceAction({\n input: { unlockTimeout: 500 },\n });\n\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<WaitForAppAndVersionDAState> = [\n getAppAndVersionPendingState(),\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDAError(\"error\"),\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["of", "throwError", "CommandResultFactory", "GLOBAL_ERRORS", "GlobalCommandError", "makeDeviceActionInternalApiMock", "testDeviceActionStates", "DeviceActionStatus", "UserInteractionRequired", "DeviceLockedError", "UnknownDAError", "waitForAppAndVersionDAStateStep", "WaitForAppAndVersionDeviceAction", "appAndVersionResult", "name", "version", "lockedErrorResult", "claNotSupportedErrorResult", "getAppAndVersionPendingState", "unlockRequestedPendingState", "getAppAndVersionMock", "waitForDeviceUnlockMock", "extractDependenciesMock", "resolve", "reject", "deviceAction", "expectedStates", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ const e=Object.freeze({GET_APP_AND_VERSION:"os.waitForAppAndVersion.steps.getAppAndVersion",UNLOCK_DEVICE:"os.waitForAppAndVersion.steps.unlockDevice"});export{e as waitForAppAndVersionDAStateStep};
2
+ //# sourceMappingURL=types.js.map