@ledgerhq/device-signer-kit-bitcoin 0.0.0-20250216001123 → 0.0.0-webhid-20250124103640

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 (179) hide show
  1. package/lib/cjs/api/app-binder/SignMessageDeviceActionTypes.js +1 -1
  2. package/lib/cjs/api/app-binder/SignMessageDeviceActionTypes.js.map +1 -1
  3. package/lib/cjs/internal/DefaultSignerBtc.test.js +1 -1
  4. package/lib/cjs/internal/DefaultSignerBtc.test.js.map +2 -2
  5. package/lib/cjs/internal/app-binder/BtcAppBinder.js +1 -1
  6. package/lib/cjs/internal/app-binder/BtcAppBinder.js.map +3 -3
  7. package/lib/cjs/internal/app-binder/BtcAppBinder.test.js +1 -1
  8. package/lib/cjs/internal/app-binder/BtcAppBinder.test.js.map +3 -3
  9. package/lib/cjs/internal/app-binder/command/GetMasterFingerprintCommand.test.js +1 -1
  10. package/lib/cjs/internal/app-binder/command/GetMasterFingerprintCommand.test.js.map +2 -2
  11. package/lib/cjs/internal/app-binder/command/GetWalletAddressCommand.test.js +1 -1
  12. package/lib/cjs/internal/app-binder/command/GetWalletAddressCommand.test.js.map +2 -2
  13. package/lib/cjs/internal/app-binder/command/RegisterWalletAddressCommand.test.js +1 -1
  14. package/lib/cjs/internal/app-binder/command/RegisterWalletAddressCommand.test.js.map +2 -2
  15. package/lib/cjs/internal/app-binder/command/client-command-handlers/GetMerkleLeafIndexCommandHandler.test.js +1 -1
  16. package/lib/cjs/internal/app-binder/command/client-command-handlers/GetMerkleLeafIndexCommandHandler.test.js.map +2 -2
  17. package/lib/cjs/internal/app-binder/command/client-command-handlers/GetMerkleLeafProofCommandHandler.test.js +1 -1
  18. package/lib/cjs/internal/app-binder/command/client-command-handlers/GetMerkleLeafProofCommandHandler.test.js.map +3 -3
  19. package/lib/cjs/internal/app-binder/command/client-command-handlers/GetMoreElementsCommandHandler.test.js +1 -1
  20. package/lib/cjs/internal/app-binder/command/client-command-handlers/GetMoreElementsCommandHandler.test.js.map +2 -2
  21. package/lib/cjs/internal/app-binder/command/client-command-handlers/GetPreimageCommandHandler.test.js +1 -1
  22. package/lib/cjs/internal/app-binder/command/client-command-handlers/GetPreimageCommandHandler.test.js.map +2 -2
  23. package/lib/cjs/internal/app-binder/command/service/ClientCommandInterpreter.test.js +1 -1
  24. package/lib/cjs/internal/app-binder/command/service/ClientCommandInterpreter.test.js.map +2 -2
  25. package/lib/cjs/internal/app-binder/command/utils/bitcoinAppError.test.js +1 -1
  26. package/lib/cjs/internal/app-binder/command/utils/bitcoinAppError.test.js.map +2 -2
  27. package/lib/cjs/internal/app-binder/device-action/GetWalletAddress/GetWalletAddressDeviceAction.test.js +1 -1
  28. package/lib/cjs/internal/app-binder/device-action/GetWalletAddress/GetWalletAddressDeviceAction.test.js.map +3 -3
  29. package/lib/cjs/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.js +2 -0
  30. package/lib/cjs/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.js.map +7 -0
  31. package/lib/cjs/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.test.js +2 -0
  32. package/lib/cjs/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.test.js.map +7 -0
  33. package/lib/cjs/internal/app-binder/device-action/SignPsbt/SignPsbtDeviceAction.test.js +1 -1
  34. package/lib/cjs/internal/app-binder/device-action/SignPsbt/SignPsbtDeviceAction.test.js.map +3 -3
  35. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +1 -1
  36. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +3 -3
  37. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +1 -1
  38. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +3 -3
  39. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js +1 -1
  40. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js.map +2 -2
  41. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupSignPsbtDAMock.js +1 -1
  42. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupSignPsbtDAMock.js.map +2 -2
  43. package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +1 -1
  44. package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +3 -3
  45. package/lib/cjs/internal/app-binder/task/BuildPsbtTask.test.js +1 -1
  46. package/lib/cjs/internal/app-binder/task/BuildPsbtTask.test.js.map +2 -2
  47. package/lib/cjs/internal/app-binder/task/ContinueTask.test.js +1 -1
  48. package/lib/cjs/internal/app-binder/task/ContinueTask.test.js.map +2 -2
  49. package/lib/cjs/internal/app-binder/task/GetWalletAddressTask.test.js +1 -1
  50. package/lib/cjs/internal/app-binder/task/GetWalletAddressTask.test.js.map +2 -2
  51. package/lib/cjs/internal/app-binder/task/PrepareWalletPolicyTask.test.js +1 -1
  52. package/lib/cjs/internal/app-binder/task/PrepareWalletPolicyTask.test.js.map +2 -2
  53. package/lib/cjs/internal/app-binder/task/SignMessageTask.test.js +1 -1
  54. package/lib/cjs/internal/app-binder/task/SignMessageTask.test.js.map +2 -2
  55. package/lib/cjs/internal/app-binder/task/SignPsbtTask.test.js +1 -1
  56. package/lib/cjs/internal/app-binder/task/SignPsbtTask.test.js.map +2 -2
  57. package/lib/cjs/internal/app-binder/task/UpdatePsbtTask.test.js +1 -1
  58. package/lib/cjs/internal/app-binder/task/UpdatePsbtTask.test.js.map +2 -2
  59. package/lib/cjs/internal/data-store/model/DataStore.test.js +1 -1
  60. package/lib/cjs/internal/data-store/model/DataStore.test.js.map +2 -2
  61. package/lib/cjs/internal/data-store/service/DefaultDataStoreService.test.js +1 -1
  62. package/lib/cjs/internal/data-store/service/DefaultDataStoreService.test.js.map +2 -2
  63. package/lib/cjs/internal/merkle-tree/service/MerkleMapBuilder.test.js +1 -1
  64. package/lib/cjs/internal/merkle-tree/service/MerkleMapBuilder.test.js.map +2 -2
  65. package/lib/cjs/internal/merkle-tree/service/MerkleTreeBuilder.test.js +1 -1
  66. package/lib/cjs/internal/merkle-tree/service/MerkleTreeBuilder.test.js.map +2 -2
  67. package/lib/cjs/internal/psbt/service/psbt/DefaultPsbtMapper.test.js +1 -1
  68. package/lib/cjs/internal/psbt/service/psbt/DefaultPsbtMapper.test.js.map +2 -2
  69. package/lib/cjs/internal/use-cases/get-extended-public-key/GetExtendedPublicKeyUseCase.test.js +1 -1
  70. package/lib/cjs/internal/use-cases/get-extended-public-key/GetExtendedPublicKeyUseCase.test.js.map +2 -2
  71. package/lib/cjs/internal/use-cases/get-wallet-address/GetWalletAddressUseCase.test.js +1 -1
  72. package/lib/cjs/internal/use-cases/get-wallet-address/GetWalletAddressUseCase.test.js.map +2 -2
  73. package/lib/cjs/internal/use-cases/sign-message/SignMessageUseCase.test.js +1 -1
  74. package/lib/cjs/internal/use-cases/sign-message/SignMessageUseCase.test.js.map +2 -2
  75. package/lib/cjs/internal/use-cases/sign-psbt/SignPsbtUseCase.test.js +1 -1
  76. package/lib/cjs/internal/use-cases/sign-psbt/SignPsbtUseCase.test.js.map +2 -2
  77. package/lib/cjs/internal/use-cases/sign-transaction/SignTransactionUseCase.test.js +1 -1
  78. package/lib/cjs/internal/use-cases/sign-transaction/SignTransactionUseCase.test.js.map +2 -2
  79. package/lib/cjs/internal/wallet/service/DefaultWalletBuilder.test.js +1 -1
  80. package/lib/cjs/internal/wallet/service/DefaultWalletBuilder.test.js.map +2 -2
  81. package/lib/cjs/internal/wallet/service/DefaultWalletSerializer.test.js +1 -1
  82. package/lib/cjs/internal/wallet/service/DefaultWalletSerializer.test.js.map +2 -2
  83. package/lib/cjs/package.json +5 -6
  84. package/lib/esm/internal/DefaultSignerBtc.test.js +1 -1
  85. package/lib/esm/internal/DefaultSignerBtc.test.js.map +2 -2
  86. package/lib/esm/internal/app-binder/BtcAppBinder.js +1 -1
  87. package/lib/esm/internal/app-binder/BtcAppBinder.js.map +3 -3
  88. package/lib/esm/internal/app-binder/BtcAppBinder.test.js +1 -1
  89. package/lib/esm/internal/app-binder/BtcAppBinder.test.js.map +3 -3
  90. package/lib/esm/internal/app-binder/command/GetMasterFingerprintCommand.test.js +1 -1
  91. package/lib/esm/internal/app-binder/command/GetMasterFingerprintCommand.test.js.map +2 -2
  92. package/lib/esm/internal/app-binder/command/GetWalletAddressCommand.test.js +1 -1
  93. package/lib/esm/internal/app-binder/command/GetWalletAddressCommand.test.js.map +2 -2
  94. package/lib/esm/internal/app-binder/command/RegisterWalletAddressCommand.test.js +1 -1
  95. package/lib/esm/internal/app-binder/command/RegisterWalletAddressCommand.test.js.map +2 -2
  96. package/lib/esm/internal/app-binder/command/client-command-handlers/GetMerkleLeafIndexCommandHandler.test.js +1 -1
  97. package/lib/esm/internal/app-binder/command/client-command-handlers/GetMerkleLeafIndexCommandHandler.test.js.map +2 -2
  98. package/lib/esm/internal/app-binder/command/client-command-handlers/GetMerkleLeafProofCommandHandler.test.js +1 -1
  99. package/lib/esm/internal/app-binder/command/client-command-handlers/GetMerkleLeafProofCommandHandler.test.js.map +3 -3
  100. package/lib/esm/internal/app-binder/command/client-command-handlers/GetMoreElementsCommandHandler.test.js +1 -1
  101. package/lib/esm/internal/app-binder/command/client-command-handlers/GetMoreElementsCommandHandler.test.js.map +2 -2
  102. package/lib/esm/internal/app-binder/command/client-command-handlers/GetPreimageCommandHandler.test.js +1 -1
  103. package/lib/esm/internal/app-binder/command/client-command-handlers/GetPreimageCommandHandler.test.js.map +2 -2
  104. package/lib/esm/internal/app-binder/command/service/ClientCommandInterpreter.test.js +1 -1
  105. package/lib/esm/internal/app-binder/command/service/ClientCommandInterpreter.test.js.map +2 -2
  106. package/lib/esm/internal/app-binder/command/utils/bitcoinAppError.test.js +1 -1
  107. package/lib/esm/internal/app-binder/command/utils/bitcoinAppError.test.js.map +2 -2
  108. package/lib/esm/internal/app-binder/device-action/GetWalletAddress/GetWalletAddressDeviceAction.test.js +1 -1
  109. package/lib/esm/internal/app-binder/device-action/GetWalletAddress/GetWalletAddressDeviceAction.test.js.map +3 -3
  110. package/lib/esm/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.js +2 -0
  111. package/lib/esm/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.js.map +7 -0
  112. package/lib/esm/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.test.js +2 -0
  113. package/lib/esm/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.test.js.map +7 -0
  114. package/lib/esm/internal/app-binder/device-action/SignPsbt/SignPsbtDeviceAction.test.js +1 -1
  115. package/lib/esm/internal/app-binder/device-action/SignPsbt/SignPsbtDeviceAction.test.js.map +3 -3
  116. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +1 -1
  117. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +3 -3
  118. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +1 -1
  119. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +3 -3
  120. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js +1 -1
  121. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js.map +2 -2
  122. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupSignPsbtDAMock.js +1 -1
  123. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupSignPsbtDAMock.js.map +2 -2
  124. package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +1 -1
  125. package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +3 -3
  126. package/lib/esm/internal/app-binder/task/BuildPsbtTask.test.js +1 -1
  127. package/lib/esm/internal/app-binder/task/BuildPsbtTask.test.js.map +2 -2
  128. package/lib/esm/internal/app-binder/task/ContinueTask.test.js +1 -1
  129. package/lib/esm/internal/app-binder/task/ContinueTask.test.js.map +2 -2
  130. package/lib/esm/internal/app-binder/task/GetWalletAddressTask.test.js +1 -1
  131. package/lib/esm/internal/app-binder/task/GetWalletAddressTask.test.js.map +2 -2
  132. package/lib/esm/internal/app-binder/task/PrepareWalletPolicyTask.test.js +1 -1
  133. package/lib/esm/internal/app-binder/task/PrepareWalletPolicyTask.test.js.map +2 -2
  134. package/lib/esm/internal/app-binder/task/SignMessageTask.test.js +1 -1
  135. package/lib/esm/internal/app-binder/task/SignMessageTask.test.js.map +2 -2
  136. package/lib/esm/internal/app-binder/task/SignPsbtTask.test.js +1 -1
  137. package/lib/esm/internal/app-binder/task/SignPsbtTask.test.js.map +2 -2
  138. package/lib/esm/internal/app-binder/task/UpdatePsbtTask.test.js +1 -1
  139. package/lib/esm/internal/app-binder/task/UpdatePsbtTask.test.js.map +2 -2
  140. package/lib/esm/internal/data-store/model/DataStore.test.js +1 -1
  141. package/lib/esm/internal/data-store/model/DataStore.test.js.map +2 -2
  142. package/lib/esm/internal/data-store/service/DefaultDataStoreService.test.js +1 -1
  143. package/lib/esm/internal/data-store/service/DefaultDataStoreService.test.js.map +2 -2
  144. package/lib/esm/internal/merkle-tree/service/MerkleMapBuilder.test.js +1 -1
  145. package/lib/esm/internal/merkle-tree/service/MerkleMapBuilder.test.js.map +2 -2
  146. package/lib/esm/internal/merkle-tree/service/MerkleTreeBuilder.test.js +1 -1
  147. package/lib/esm/internal/merkle-tree/service/MerkleTreeBuilder.test.js.map +2 -2
  148. package/lib/esm/internal/psbt/service/psbt/DefaultPsbtMapper.test.js +1 -1
  149. package/lib/esm/internal/psbt/service/psbt/DefaultPsbtMapper.test.js.map +2 -2
  150. package/lib/esm/internal/use-cases/get-extended-public-key/GetExtendedPublicKeyUseCase.test.js +1 -1
  151. package/lib/esm/internal/use-cases/get-extended-public-key/GetExtendedPublicKeyUseCase.test.js.map +2 -2
  152. package/lib/esm/internal/use-cases/get-wallet-address/GetWalletAddressUseCase.test.js +1 -1
  153. package/lib/esm/internal/use-cases/get-wallet-address/GetWalletAddressUseCase.test.js.map +2 -2
  154. package/lib/esm/internal/use-cases/sign-message/SignMessageUseCase.test.js +1 -1
  155. package/lib/esm/internal/use-cases/sign-message/SignMessageUseCase.test.js.map +2 -2
  156. package/lib/esm/internal/use-cases/sign-psbt/SignPsbtUseCase.test.js +1 -1
  157. package/lib/esm/internal/use-cases/sign-psbt/SignPsbtUseCase.test.js.map +2 -2
  158. package/lib/esm/internal/use-cases/sign-transaction/SignTransactionUseCase.test.js +1 -1
  159. package/lib/esm/internal/use-cases/sign-transaction/SignTransactionUseCase.test.js.map +2 -2
  160. package/lib/esm/internal/wallet/service/DefaultWalletBuilder.test.js +1 -1
  161. package/lib/esm/internal/wallet/service/DefaultWalletBuilder.test.js.map +2 -2
  162. package/lib/esm/internal/wallet/service/DefaultWalletSerializer.test.js +1 -1
  163. package/lib/esm/internal/wallet/service/DefaultWalletSerializer.test.js.map +2 -2
  164. package/lib/esm/package.json +5 -6
  165. package/lib/types/api/app-binder/SignMessageDeviceActionTypes.d.ts +12 -1
  166. package/lib/types/api/app-binder/SignMessageDeviceActionTypes.d.ts.map +1 -1
  167. package/lib/types/internal/app-binder/BtcAppBinder.d.ts.map +1 -1
  168. package/lib/types/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.d.ts +19 -0
  169. package/lib/types/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.d.ts.map +1 -0
  170. package/lib/types/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.test.d.ts +2 -0
  171. package/lib/types/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.test.d.ts.map +1 -0
  172. package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts +1 -2
  173. package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts.map +1 -1
  174. package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts.map +1 -1
  175. package/lib/types/internal/app-binder/device-action/__test-utils__/setupSignPsbtDAMock.d.ts.map +1 -1
  176. package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts +2 -5
  177. package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts.map +1 -1
  178. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  179. package/package.json +10 -11
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/app-binder/command/client-command-handlers/GetMoreElementsCommandHandler.test.ts"],
4
- "sourcesContent": ["import {\n APDU_MAX_PAYLOAD,\n type DmkError,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Mocked } from \"vitest\";\n\nimport { ClientCommandCodes } from \"@internal/app-binder/command/utils/constants\";\nimport { type DataStore } from \"@internal/data-store/model/DataStore\";\n\nimport { type CommandHandlerContext } from \"./ClientCommandHandlersTypes\";\nimport { ClientCommandHandlerError } from \"./Errors\";\nimport { GetMoreElementsCommandHandler } from \"./GetMoreElementsCommandHandler\";\n\nconst COMMAND_CODE = ClientCommandCodes.GET_MORE_ELEMENTS;\n\ndescribe(\"GetMoreElementsCommandHandler\", () => {\n let commandHandlerContext: CommandHandlerContext;\n let mockDataStore: Mocked<DataStore>;\n\n beforeEach(() => {\n vi.clearAllMocks();\n\n mockDataStore = {} as unknown as Mocked<DataStore>;\n\n commandHandlerContext = {\n dataStore: mockDataStore,\n queue: [],\n yieldedResults: [],\n };\n });\n\n const buildRequest = (commandCode: number): Uint8Array =>\n new Uint8Array([commandCode]);\n\n const createElement = (elementSize: number, fillValue: number): Uint8Array =>\n new Uint8Array(Array(elementSize).fill(fillValue));\n\n it(\"should retrieve the maximum number of elements within the payload size\", () => {\n // given\n const request = buildRequest(COMMAND_CODE);\n const elementSize = 50;\n const maximumElements = Math.floor(\n (APDU_MAX_PAYLOAD - 1 - 1) / elementSize,\n );\n const elements = Array.from({ length: maximumElements }, (_, index) =>\n createElement(elementSize, 0x10 + index),\n );\n\n // when\n commandHandlerContext.queue = [...elements];\n\n const response = GetMoreElementsCommandHandler(\n request,\n commandHandlerContext,\n );\n\n const expectedResponse = new Uint8Array(\n 1 + 1 + maximumElements * elementSize,\n );\n expectedResponse[0] = maximumElements;\n expectedResponse[1] = elementSize;\n for (let elementIndex = 0; elementIndex < maximumElements; elementIndex++) {\n expectedResponse.set(\n elements[elementIndex] as Uint8Array,\n 2 + elementIndex * elementSize,\n );\n }\n\n // then\n expect(response.isRight()).toBe(true);\n expect(response.unsafeCoerce()).toEqual(expectedResponse);\n expect(commandHandlerContext.queue).toHaveLength(0);\n });\n\n it(\"should retrieve the maximum number of elements allowed and queue the remainder\", () => {\n // given\n const request = buildRequest(COMMAND_CODE);\n const elementSize = 30;\n const maximumElements = Math.floor(\n (APDU_MAX_PAYLOAD - 1 - 1) / elementSize,\n );\n const totalElements = maximumElements + 5;\n const elements = Array.from({ length: totalElements }, (_, index) =>\n createElement(elementSize, 0x20 + index),\n );\n\n // when\n commandHandlerContext.queue = [...elements];\n\n const response = GetMoreElementsCommandHandler(\n request,\n commandHandlerContext,\n );\n\n const expectedResponse = new Uint8Array(\n 1 + 1 + maximumElements * elementSize,\n );\n expectedResponse[0] = maximumElements;\n expectedResponse[1] = elementSize;\n for (let elementIndex = 0; elementIndex < maximumElements; elementIndex++) {\n expectedResponse.set(\n elements[elementIndex] as Uint8Array,\n 2 + elementIndex * elementSize,\n );\n }\n\n // then\n expect(response.isRight()).toBe(true);\n expect(response.unsafeCoerce()).toEqual(expectedResponse);\n expect(commandHandlerContext.queue).toHaveLength(\n totalElements - maximumElements,\n );\n for (\n let queuedElementIndex = 0;\n queuedElementIndex < commandHandlerContext.queue.length;\n queuedElementIndex++\n ) {\n expect(commandHandlerContext.queue[queuedElementIndex]).toEqual(\n elements[maximumElements + queuedElementIndex],\n );\n }\n });\n\n it(\"should return an error when queue is empty\", () => {\n // given\n const request = buildRequest(COMMAND_CODE);\n\n // when\n commandHandlerContext.queue = [];\n\n const response = GetMoreElementsCommandHandler(\n request,\n commandHandlerContext,\n );\n\n // then\n expect(response.isLeft()).toBe(true);\n response.caseOf({\n Left: (error: DmkError) => {\n expect(error).toBeInstanceOf(ClientCommandHandlerError);\n expect(commandHandlerContext.queue).toHaveLength(0);\n },\n Right: (_) => {\n throw new Error(\"Expected Left, got Right\");\n },\n });\n });\n\n it(\"should return an error when the first element is undefined\", () => {\n // given\n const request = buildRequest(COMMAND_CODE);\n\n // when\n commandHandlerContext.queue = [undefined as unknown as Uint8Array];\n\n const response = GetMoreElementsCommandHandler(\n request,\n commandHandlerContext,\n );\n\n // then\n expect(response.isLeft()).toBe(true);\n response.caseOf({\n Left: (error: DmkError) => {\n expect(error).toBeInstanceOf(ClientCommandHandlerError);\n expect(commandHandlerContext.queue).toHaveLength(1);\n },\n Right: (_) => {\n throw new Error(\"Expected Left, got Right\");\n },\n });\n });\n\n it(\"should return an error when elements in queue have varying lengths\", () => {\n // given\n const request = buildRequest(COMMAND_CODE);\n const firstElement = createElement(40, 0x30);\n const secondElement = createElement(50, 0x31);\n\n // when\n commandHandlerContext.queue = [firstElement, secondElement];\n\n const response = GetMoreElementsCommandHandler(\n request,\n commandHandlerContext,\n );\n\n // then\n expect(response.isLeft()).toBe(true);\n response.caseOf({\n Left: (error: DmkError) => {\n expect(error).toBeInstanceOf(ClientCommandHandlerError);\n expect(commandHandlerContext.queue).toHaveLength(2);\n },\n Right: (_) => {\n throw new Error(\"Expected Left, got Right\");\n },\n });\n });\n\n it(\"should handle a single element that matches the maximum payload size\", () => {\n // given\n const request = buildRequest(COMMAND_CODE);\n const elementSize = 253;\n const elements = [createElement(elementSize, 0x40)];\n\n // when\n commandHandlerContext.queue = [...elements];\n\n const response = GetMoreElementsCommandHandler(\n request,\n commandHandlerContext,\n );\n\n const expectedResponse = new Uint8Array(1 + 1 + elementSize);\n expectedResponse[0] = 1;\n expectedResponse[1] = elementSize;\n expectedResponse.set(elements[0] as Uint8Array, 2);\n\n // then\n expect(response.isRight()).toBe(true);\n expect(response.unsafeCoerce()).toEqual(expectedResponse);\n expect(commandHandlerContext.queue).toHaveLength(0);\n });\n\n it(\"should handle a single element that exceeds the maximum payload size\", () => {\n // given\n const request = buildRequest(COMMAND_CODE);\n const elementSize = 254;\n const elements = [createElement(elementSize, 0x50)];\n\n // when\n commandHandlerContext.queue = [...elements];\n\n const response = GetMoreElementsCommandHandler(\n request,\n commandHandlerContext,\n );\n\n const expectedResponse = new Uint8Array([0, elementSize]);\n\n // then\n expect(response.isRight()).toBe(true);\n expect(response.unsafeCoerce()).toEqual(expectedResponse);\n expect(commandHandlerContext.queue).toHaveLength(1); // still there\n });\n\n it(\"should handle multiple executions correctly\", () => {\n // given\n const request = buildRequest(COMMAND_CODE);\n const elementSize = 60;\n const maximumElements = Math.floor(\n (APDU_MAX_PAYLOAD - 1 - 1) / elementSize,\n );\n const totalElements = 10;\n const elements = Array.from({ length: totalElements }, (_, index) =>\n createElement(elementSize, 0x60 + index),\n );\n\n // when\n commandHandlerContext.queue = [...elements];\n\n // then\n for (\n let executionIndex = 0;\n executionIndex < Math.ceil(totalElements / maximumElements);\n executionIndex++\n ) {\n const previousQueueLength = commandHandlerContext.queue.length;\n const expectedNumberOfElements = Math.min(\n maximumElements,\n previousQueueLength,\n );\n const expectedResponse = new Uint8Array(\n 1 + 1 + expectedNumberOfElements * elementSize,\n );\n expectedResponse[0] = expectedNumberOfElements;\n expectedResponse[1] = elementSize;\n for (\n let elementIndex = 0;\n elementIndex < expectedNumberOfElements;\n elementIndex++\n ) {\n expectedResponse.set(\n commandHandlerContext.queue[elementIndex] as Uint8Array,\n 2 + elementIndex * elementSize,\n );\n }\n\n const response = GetMoreElementsCommandHandler(\n request,\n commandHandlerContext,\n );\n\n expect(response.isRight()).toBe(true);\n expect(response.unsafeCoerce()).toEqual(expectedResponse);\n expect(commandHandlerContext.queue).toHaveLength(\n previousQueueLength - expectedNumberOfElements,\n );\n }\n\n expect(commandHandlerContext.queue).toHaveLength(0);\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n APDU_MAX_PAYLOAD,\n type DmkError,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { ClientCommandCodes } from \"@internal/app-binder/command/utils/constants\";\nimport { type DataStore } from \"@internal/data-store/model/DataStore\";\n\nimport { type CommandHandlerContext } from \"./ClientCommandHandlersTypes\";\nimport { ClientCommandHandlerError } from \"./Errors\";\nimport { GetMoreElementsCommandHandler } from \"./GetMoreElementsCommandHandler\";\n\nconst COMMAND_CODE = ClientCommandCodes.GET_MORE_ELEMENTS;\n\ndescribe(\"GetMoreElementsCommandHandler\", () => {\n let commandHandlerContext: CommandHandlerContext;\n let mockDataStore: jest.Mocked<DataStore>;\n\n beforeEach(() => {\n jest.clearAllMocks();\n\n mockDataStore = {} as unknown as jest.Mocked<DataStore>;\n\n commandHandlerContext = {\n dataStore: mockDataStore,\n queue: [],\n yieldedResults: [],\n };\n });\n\n const buildRequest = (commandCode: number): Uint8Array =>\n new Uint8Array([commandCode]);\n\n const createElement = (elementSize: number, fillValue: number): Uint8Array =>\n new Uint8Array(Array(elementSize).fill(fillValue));\n\n it(\"should retrieve the maximum number of elements within the payload size\", () => {\n // given\n const request = buildRequest(COMMAND_CODE);\n const elementSize = 50;\n const maximumElements = Math.floor(\n (APDU_MAX_PAYLOAD - 1 - 1) / elementSize,\n );\n const elements = Array.from({ length: maximumElements }, (_, index) =>\n createElement(elementSize, 0x10 + index),\n );\n\n // when\n commandHandlerContext.queue = [...elements];\n\n const response = GetMoreElementsCommandHandler(\n request,\n commandHandlerContext,\n );\n\n const expectedResponse = new Uint8Array(\n 1 + 1 + maximumElements * elementSize,\n );\n expectedResponse[0] = maximumElements;\n expectedResponse[1] = elementSize;\n for (let elementIndex = 0; elementIndex < maximumElements; elementIndex++) {\n expectedResponse.set(\n elements[elementIndex] as Uint8Array,\n 2 + elementIndex * elementSize,\n );\n }\n\n // then\n expect(response.isRight()).toBe(true);\n expect(response.unsafeCoerce()).toEqual(expectedResponse);\n expect(commandHandlerContext.queue).toHaveLength(0);\n });\n\n it(\"should retrieve the maximum number of elements allowed and queue the remainder\", () => {\n // given\n const request = buildRequest(COMMAND_CODE);\n const elementSize = 30;\n const maximumElements = Math.floor(\n (APDU_MAX_PAYLOAD - 1 - 1) / elementSize,\n );\n const totalElements = maximumElements + 5;\n const elements = Array.from({ length: totalElements }, (_, index) =>\n createElement(elementSize, 0x20 + index),\n );\n\n // when\n commandHandlerContext.queue = [...elements];\n\n const response = GetMoreElementsCommandHandler(\n request,\n commandHandlerContext,\n );\n\n const expectedResponse = new Uint8Array(\n 1 + 1 + maximumElements * elementSize,\n );\n expectedResponse[0] = maximumElements;\n expectedResponse[1] = elementSize;\n for (let elementIndex = 0; elementIndex < maximumElements; elementIndex++) {\n expectedResponse.set(\n elements[elementIndex] as Uint8Array,\n 2 + elementIndex * elementSize,\n );\n }\n\n // then\n expect(response.isRight()).toBe(true);\n expect(response.unsafeCoerce()).toEqual(expectedResponse);\n expect(commandHandlerContext.queue).toHaveLength(\n totalElements - maximumElements,\n );\n for (\n let queuedElementIndex = 0;\n queuedElementIndex < commandHandlerContext.queue.length;\n queuedElementIndex++\n ) {\n expect(commandHandlerContext.queue[queuedElementIndex]).toEqual(\n elements[maximumElements + queuedElementIndex],\n );\n }\n });\n\n it(\"should return an error when queue is empty\", () => {\n // given\n const request = buildRequest(COMMAND_CODE);\n\n // when\n commandHandlerContext.queue = [];\n\n const response = GetMoreElementsCommandHandler(\n request,\n commandHandlerContext,\n );\n\n // then\n expect(response.isLeft()).toBe(true);\n response.caseOf({\n Left: (error: DmkError) => {\n expect(error).toBeInstanceOf(ClientCommandHandlerError);\n expect(commandHandlerContext.queue).toHaveLength(0);\n },\n Right: (_) => {\n throw new Error(\"Expected Left, got Right\");\n },\n });\n });\n\n it(\"should return an error when the first element is undefined\", () => {\n // given\n const request = buildRequest(COMMAND_CODE);\n\n // when\n commandHandlerContext.queue = [undefined as unknown as Uint8Array];\n\n const response = GetMoreElementsCommandHandler(\n request,\n commandHandlerContext,\n );\n\n // then\n expect(response.isLeft()).toBe(true);\n response.caseOf({\n Left: (error: DmkError) => {\n expect(error).toBeInstanceOf(ClientCommandHandlerError);\n expect(commandHandlerContext.queue).toHaveLength(1);\n },\n Right: (_) => {\n throw new Error(\"Expected Left, got Right\");\n },\n });\n });\n\n it(\"should return an error when elements in queue have varying lengths\", () => {\n // given\n const request = buildRequest(COMMAND_CODE);\n const firstElement = createElement(40, 0x30);\n const secondElement = createElement(50, 0x31);\n\n // when\n commandHandlerContext.queue = [firstElement, secondElement];\n\n const response = GetMoreElementsCommandHandler(\n request,\n commandHandlerContext,\n );\n\n // then\n expect(response.isLeft()).toBe(true);\n response.caseOf({\n Left: (error: DmkError) => {\n expect(error).toBeInstanceOf(ClientCommandHandlerError);\n expect(commandHandlerContext.queue).toHaveLength(2);\n },\n Right: (_) => {\n throw new Error(\"Expected Left, got Right\");\n },\n });\n });\n\n it(\"should handle a single element that matches the maximum payload size\", () => {\n // given\n const request = buildRequest(COMMAND_CODE);\n const elementSize = 253;\n const elements = [createElement(elementSize, 0x40)];\n\n // when\n commandHandlerContext.queue = [...elements];\n\n const response = GetMoreElementsCommandHandler(\n request,\n commandHandlerContext,\n );\n\n const expectedResponse = new Uint8Array(1 + 1 + elementSize);\n expectedResponse[0] = 1;\n expectedResponse[1] = elementSize;\n expectedResponse.set(elements[0] as Uint8Array, 2);\n\n // then\n expect(response.isRight()).toBe(true);\n expect(response.unsafeCoerce()).toEqual(expectedResponse);\n expect(commandHandlerContext.queue).toHaveLength(0);\n });\n\n it(\"should handle a single element that exceeds the maximum payload size\", () => {\n // given\n const request = buildRequest(COMMAND_CODE);\n const elementSize = 254;\n const elements = [createElement(elementSize, 0x50)];\n\n // when\n commandHandlerContext.queue = [...elements];\n\n const response = GetMoreElementsCommandHandler(\n request,\n commandHandlerContext,\n );\n\n const expectedResponse = new Uint8Array([0, elementSize]);\n\n // then\n expect(response.isRight()).toBe(true);\n expect(response.unsafeCoerce()).toEqual(expectedResponse);\n expect(commandHandlerContext.queue).toHaveLength(1); // still there\n });\n\n it(\"should handle multiple executions correctly\", () => {\n // given\n const request = buildRequest(COMMAND_CODE);\n const elementSize = 60;\n const maximumElements = Math.floor(\n (APDU_MAX_PAYLOAD - 1 - 1) / elementSize,\n );\n const totalElements = 10;\n const elements = Array.from({ length: totalElements }, (_, index) =>\n createElement(elementSize, 0x60 + index),\n );\n\n // when\n commandHandlerContext.queue = [...elements];\n\n // then\n for (\n let executionIndex = 0;\n executionIndex < Math.ceil(totalElements / maximumElements);\n executionIndex++\n ) {\n const previousQueueLength = commandHandlerContext.queue.length;\n const expectedNumberOfElements = Math.min(\n maximumElements,\n previousQueueLength,\n );\n const expectedResponse = new Uint8Array(\n 1 + 1 + expectedNumberOfElements * elementSize,\n );\n expectedResponse[0] = expectedNumberOfElements;\n expectedResponse[1] = elementSize;\n for (\n let elementIndex = 0;\n elementIndex < expectedNumberOfElements;\n elementIndex++\n ) {\n expectedResponse.set(\n commandHandlerContext.queue[elementIndex] as Uint8Array,\n 2 + elementIndex * elementSize,\n );\n }\n\n const response = GetMoreElementsCommandHandler(\n request,\n commandHandlerContext,\n );\n\n expect(response.isRight()).toBe(true);\n expect(response.unsafeCoerce()).toEqual(expectedResponse);\n expect(commandHandlerContext.queue).toHaveLength(\n previousQueueLength - expectedNumberOfElements,\n );\n }\n\n expect(commandHandlerContext.queue).toHaveLength(0);\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_device_management_kit", "import_constants", "import_Errors", "import_GetMoreElementsCommandHandler", "COMMAND_CODE", "commandHandlerContext", "mockDataStore", "buildRequest", "commandCode", "createElement", "elementSize", "fillValue", "request", "maximumElements", "elements", "_", "index", "response", "expectedResponse", "elementIndex", "totalElements", "queuedElementIndex", "error", "firstElement", "secondElement", "executionIndex", "previousQueueLength", "expectedNumberOfElements"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var c=require("purify-ts"),h=require("../../../app-binder/command/utils/constants"),m=require("../../../utils/Varint"),p=require("./Errors"),u=require("./GetPreimageCommandHandler");const x=h.ClientCommandCodes.GET_PREIMAGE;vi.mock("@internal/utils/Varint",()=>({encodeVarint:vi.fn()}));describe("GetPreimageCommandHandler",()=>{let t,o;beforeEach(()=>{vi.clearAllMocks(),o={getPreimage:vi.fn()},t={dataStore:o,queue:[],yieldedResults:[]}}),it("should return the preimage when it is found and its length is within the maximum payload size",()=>{const r=new Uint8Array(h.SHA256_SIZE).fill(1),e=new Uint8Array([170,187,204]),l=e.length;m.encodeVarint.mockReturnValue({unsafeCoerce:()=>new Uint8Array([3])}),o.getPreimage.mockReturnValue((0,c.Just)(e));const s=new Uint8Array([x,0,...r]),i=(0,u.GetPreimageCommandHandler)(s,t),a=new Uint8Array([3,3,170,187,204]);expect(o.getPreimage).toHaveBeenCalledWith(r),expect(m.encodeVarint).toHaveBeenCalledWith(l),i.caseOf({Left:n=>{throw new Error("Expected Right, got Left")},Right:n=>{expect(n).toEqual(a),expect(t.queue).toHaveLength(0)}})}),it("should handle a preimage longer than the maximum payload size by queuing the remaining bytes",()=>{const r=new Uint8Array(h.SHA256_SIZE).fill(2),e=new Uint8Array(300).fill(255),l=e.length;m.encodeVarint.mockReturnValue({unsafeCoerce:()=>new Uint8Array([172,2])}),o.getPreimage.mockReturnValue((0,c.Just)(e));const s=new Uint8Array([x,0,...r]),i=(0,u.GetPreimageCommandHandler)(s,t),a=new Uint8Array([172,2]),n=Math.min(255-a.length-1,e.length),g=new Uint8Array(a.length+1+n);g.set(a,0),g.set([n],a.length),g.set(e.slice(0,n),a.length+1),expect(o.getPreimage).toHaveBeenCalledWith(r),expect(m.encodeVarint).toHaveBeenCalledWith(l),i.caseOf({Left:d=>{throw new Error("Expected Right, got Left")},Right:d=>{expect(d).toEqual(g),expect(t.queue).toHaveLength(e.length-n),expect(t.queue[0]).toEqual(new Uint8Array([255])),expect(t.queue[t.queue.length-1]).toEqual(new Uint8Array([255]))}})}),it("should return an error when the preimage is not found",()=>{const r=new Uint8Array(h.SHA256_SIZE).fill(3);o.getPreimage.mockReturnValue(c.Nothing);const e=new Uint8Array([x,0,...r]),l=(0,u.GetPreimageCommandHandler)(e,t);expect(o.getPreimage).toHaveBeenCalledWith(r),expect(m.encodeVarint).not.toHaveBeenCalled(),expect(t.queue).toHaveLength(0),l.caseOf({Left:s=>{expect(s).toBeInstanceOf(p.ClientCommandHandlerError)},Right:s=>{throw new Error("Expected Left, got Right")}})}),it("should handle a preimage length where the maximum payload size exactly matches the preimage length",()=>{const r=new Uint8Array(h.SHA256_SIZE).fill(5),e=new Uint8Array(252);e.fill(119),m.encodeVarint.mockReturnValue({unsafeCoerce:()=>new Uint8Array([252])}),o.getPreimage.mockReturnValue((0,c.Just)(e));const l=new Uint8Array([x,0,...r]),s=(0,u.GetPreimageCommandHandler)(l,t),i=new Uint8Array([252]),a=Math.min(255-i.length-1,e.length),n=new Uint8Array(i.length+1+a);n.set(i,0),n.set([a],i.length),n.set(e,i.length+1),expect(s).toStrictEqual(c.Either.of(n)),expect(t.queue).toHaveLength(0)})});
1
+ "use strict";var l=require("purify-ts"),h=require("../../../app-binder/command/utils/constants"),m=require("../../../utils/Varint"),p=require("./Errors"),u=require("./GetPreimageCommandHandler");const x=h.ClientCommandCodes.GET_PREIMAGE;jest.mock("@internal/utils/Varint",()=>({encodeVarint:jest.fn()}));describe("GetPreimageCommandHandler",()=>{let t,o;beforeEach(()=>{jest.clearAllMocks(),o={getPreimage:jest.fn()},t={dataStore:o,queue:[],yieldedResults:[]}}),it("should return the preimage when it is found and its length is within the maximum payload size",()=>{const r=new Uint8Array(h.SHA256_SIZE).fill(1),e=new Uint8Array([170,187,204]),c=e.length;m.encodeVarint.mockReturnValue({unsafeCoerce:()=>new Uint8Array([3])}),o.getPreimage.mockReturnValue((0,l.Just)(e));const s=new Uint8Array([x,0,...r]),i=(0,u.GetPreimageCommandHandler)(s,t),a=new Uint8Array([3,3,170,187,204]);expect(o.getPreimage).toHaveBeenCalledWith(r),expect(m.encodeVarint).toHaveBeenCalledWith(c),i.caseOf({Left:n=>{throw new Error("Expected Right, got Left")},Right:n=>{expect(n).toEqual(a),expect(t.queue).toHaveLength(0)}})}),it("should handle a preimage longer than the maximum payload size by queuing the remaining bytes",()=>{const r=new Uint8Array(h.SHA256_SIZE).fill(2),e=new Uint8Array(300).fill(255),c=e.length;m.encodeVarint.mockReturnValue({unsafeCoerce:()=>new Uint8Array([172,2])}),o.getPreimage.mockReturnValue((0,l.Just)(e));const s=new Uint8Array([x,0,...r]),i=(0,u.GetPreimageCommandHandler)(s,t),a=new Uint8Array([172,2]),n=Math.min(255-a.length-1,e.length),g=new Uint8Array(a.length+1+n);g.set(a,0),g.set([n],a.length),g.set(e.slice(0,n),a.length+1),expect(o.getPreimage).toHaveBeenCalledWith(r),expect(m.encodeVarint).toHaveBeenCalledWith(c),i.caseOf({Left:d=>{throw new Error("Expected Right, got Left")},Right:d=>{expect(d).toEqual(g),expect(t.queue).toHaveLength(e.length-n),expect(t.queue[0]).toEqual(new Uint8Array([255])),expect(t.queue[t.queue.length-1]).toEqual(new Uint8Array([255]))}})}),it("should return an error when the preimage is not found",()=>{const r=new Uint8Array(h.SHA256_SIZE).fill(3);o.getPreimage.mockReturnValue(l.Nothing);const e=new Uint8Array([x,0,...r]),c=(0,u.GetPreimageCommandHandler)(e,t);expect(o.getPreimage).toHaveBeenCalledWith(r),expect(m.encodeVarint).not.toHaveBeenCalled(),expect(t.queue).toHaveLength(0),c.caseOf({Left:s=>{expect(s).toBeInstanceOf(p.ClientCommandHandlerError)},Right:s=>{throw new Error("Expected Left, got Right")}})}),it("should handle a preimage length where the maximum payload size exactly matches the preimage length",()=>{const r=new Uint8Array(h.SHA256_SIZE).fill(5),e=new Uint8Array(252);e.fill(119),m.encodeVarint.mockReturnValue({unsafeCoerce:()=>new Uint8Array([252])}),o.getPreimage.mockReturnValue((0,l.Just)(e));const c=new Uint8Array([x,0,...r]),s=(0,u.GetPreimageCommandHandler)(c,t),i=new Uint8Array([252]),a=Math.min(255-i.length-1,e.length),n=new Uint8Array(i.length+1+a);n.set(i,0),n.set([a],i.length),n.set(e,i.length+1),expect(s).toStrictEqual(l.Either.of(n)),expect(t.queue).toHaveLength(0)})});
2
2
  //# sourceMappingURL=GetPreimageCommandHandler.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/app-binder/command/client-command-handlers/GetPreimageCommandHandler.test.ts"],
4
- "sourcesContent": ["import { type DmkError } from \"@ledgerhq/device-management-kit\";\nimport { Either, Just, Nothing } from \"purify-ts\";\nimport { type Mock, type Mocked } from \"vitest\";\n\nimport {\n ClientCommandCodes,\n SHA256_SIZE,\n} from \"@internal/app-binder/command/utils/constants\";\nimport { type DataStore } from \"@internal/data-store/model/DataStore\";\nimport { encodeVarint } from \"@internal/utils/Varint\";\n\nimport { type CommandHandlerContext } from \"./ClientCommandHandlersTypes\";\nimport { ClientCommandHandlerError } from \"./Errors\";\nimport { GetPreimageCommandHandler } from \"./GetPreimageCommandHandler\";\n\nconst COMMAND_CODE = ClientCommandCodes.GET_PREIMAGE;\n\nvi.mock(\"@internal/utils/Varint\", () => ({\n encodeVarint: vi.fn(),\n}));\n\ndescribe(\"GetPreimageCommandHandler\", () => {\n let commandHandlerContext: CommandHandlerContext;\n let mockDataStore: Mocked<DataStore>;\n\n beforeEach(() => {\n vi.clearAllMocks();\n\n mockDataStore = {\n getPreimage: vi.fn(),\n } as unknown as Mocked<DataStore>;\n\n commandHandlerContext = {\n dataStore: mockDataStore,\n queue: [],\n yieldedResults: [],\n };\n });\n\n it(\"should return the preimage when it is found and its length is within the maximum payload size\", () => {\n // given\n const requestHash = new Uint8Array(SHA256_SIZE).fill(0x01);\n const preimage = new Uint8Array([0xaa, 0xbb, 0xcc]);\n const preimageLength = preimage.length;\n\n // when\n (encodeVarint as Mock).mockReturnValue({\n unsafeCoerce: () => new Uint8Array([0x03]), // varint for 3\n });\n\n mockDataStore.getPreimage.mockReturnValue(Just(preimage));\n\n const request = new Uint8Array([COMMAND_CODE, 0x00, ...requestHash]);\n\n const handlerResult = GetPreimageCommandHandler(\n request,\n commandHandlerContext,\n );\n\n const expectedResponse = new Uint8Array([0x03, 0x03, 0xaa, 0xbb, 0xcc]);\n\n // then\n expect(mockDataStore.getPreimage).toHaveBeenCalledWith(requestHash);\n expect(encodeVarint).toHaveBeenCalledWith(preimageLength);\n handlerResult.caseOf({\n Left: (_) => {\n throw new Error(\"Expected Right, got Left\");\n },\n Right: (response) => {\n expect(response).toEqual(expectedResponse);\n expect(commandHandlerContext.queue).toHaveLength(0);\n },\n });\n });\n\n it(\"should handle a preimage longer than the maximum payload size by queuing the remaining bytes\", () => {\n // given\n const requestHash = new Uint8Array(SHA256_SIZE).fill(0x02);\n const preimage = new Uint8Array(300).fill(0xff);\n const preimageLength = preimage.length;\n\n // when\n (encodeVarint as Mock).mockReturnValue({\n unsafeCoerce: () => new Uint8Array([0xac, 0x02]),\n });\n\n mockDataStore.getPreimage.mockReturnValue(Just(preimage));\n\n const request = new Uint8Array([COMMAND_CODE, 0x00, ...requestHash]);\n\n const handlerResult = GetPreimageCommandHandler(\n request,\n commandHandlerContext,\n );\n\n const varintEncodedLength = new Uint8Array([0xac, 0x02]); // varint for 300\n const maximumBytesInResponse = Math.min(\n 255 - varintEncodedLength.length - 1,\n preimage.length,\n );\n const expectedResponse = new Uint8Array(\n varintEncodedLength.length + 1 + maximumBytesInResponse,\n );\n expectedResponse.set(varintEncodedLength, 0); // varint\n expectedResponse.set([maximumBytesInResponse], varintEncodedLength.length); // bytes in response\n expectedResponse.set(\n preimage.slice(0, maximumBytesInResponse),\n varintEncodedLength.length + 1,\n );\n\n // then\n expect(mockDataStore.getPreimage).toHaveBeenCalledWith(requestHash);\n expect(encodeVarint).toHaveBeenCalledWith(preimageLength);\n handlerResult.caseOf({\n Left: (_) => {\n throw new Error(\"Expected Right, got Left\");\n },\n Right: (response) => {\n expect(response).toEqual(expectedResponse);\n expect(commandHandlerContext.queue).toHaveLength(\n preimage.length - maximumBytesInResponse,\n );\n expect(commandHandlerContext.queue[0]).toEqual(new Uint8Array([0xff]));\n expect(\n commandHandlerContext.queue[commandHandlerContext.queue.length - 1],\n ).toEqual(new Uint8Array([0xff]));\n },\n });\n });\n\n it(\"should return an error when the preimage is not found\", () => {\n // given\n const requestHash = new Uint8Array(SHA256_SIZE).fill(0x03);\n\n // when\n mockDataStore.getPreimage.mockReturnValue(Nothing);\n\n const request = new Uint8Array([COMMAND_CODE, 0x00, ...requestHash]);\n\n const handlerResult = GetPreimageCommandHandler(\n request,\n commandHandlerContext,\n );\n\n // then\n expect(mockDataStore.getPreimage).toHaveBeenCalledWith(requestHash);\n expect(encodeVarint).not.toHaveBeenCalled();\n expect(commandHandlerContext.queue).toHaveLength(0);\n handlerResult.caseOf({\n Left: (error: DmkError) => {\n expect(error).toBeInstanceOf(ClientCommandHandlerError);\n },\n Right: (_) => {\n throw new Error(\"Expected Left, got Right\");\n },\n });\n });\n\n it(\"should handle a preimage length where the maximum payload size exactly matches the preimage length\", () => {\n // given\n const requestHash = new Uint8Array(SHA256_SIZE).fill(0x05);\n const preimage = new Uint8Array(252);\n preimage.fill(0x77);\n\n // when\n (encodeVarint as Mock).mockReturnValue({\n unsafeCoerce: () => new Uint8Array([0xfc]),\n });\n\n mockDataStore.getPreimage.mockReturnValue(Just(preimage));\n\n const request = new Uint8Array([COMMAND_CODE, 0x00, ...requestHash]);\n\n const handlerResult = GetPreimageCommandHandler(\n request,\n commandHandlerContext,\n );\n\n const varintEncodedLength = new Uint8Array([0xfc]);\n const maximumBytesInResponse = Math.min(\n 255 - varintEncodedLength.length - 1,\n preimage.length,\n );\n const expectedResponse = new Uint8Array(\n varintEncodedLength.length + 1 + maximumBytesInResponse,\n );\n expectedResponse.set(varintEncodedLength, 0);\n expectedResponse.set([maximumBytesInResponse], varintEncodedLength.length);\n expectedResponse.set(preimage, varintEncodedLength.length + 1);\n\n // then\n expect(handlerResult).toStrictEqual(Either.of(expectedResponse));\n expect(commandHandlerContext.queue).toHaveLength(0);\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { type DmkError } from \"@ledgerhq/device-management-kit\";\nimport { Either, Just, Nothing } from \"purify-ts\";\n\nimport {\n ClientCommandCodes,\n SHA256_SIZE,\n} from \"@internal/app-binder/command/utils/constants\";\nimport { type DataStore } from \"@internal/data-store/model/DataStore\";\nimport { encodeVarint } from \"@internal/utils/Varint\";\n\nimport { type CommandHandlerContext } from \"./ClientCommandHandlersTypes\";\nimport { ClientCommandHandlerError } from \"./Errors\";\nimport { GetPreimageCommandHandler } from \"./GetPreimageCommandHandler\";\n\nconst COMMAND_CODE = ClientCommandCodes.GET_PREIMAGE;\n\njest.mock(\"@internal/utils/Varint\", () => ({\n encodeVarint: jest.fn(),\n}));\n\ndescribe(\"GetPreimageCommandHandler\", () => {\n let commandHandlerContext: CommandHandlerContext;\n let mockDataStore: jest.Mocked<DataStore>;\n\n beforeEach(() => {\n jest.clearAllMocks();\n\n mockDataStore = {\n getPreimage: jest.fn(),\n } as unknown as jest.Mocked<DataStore>;\n\n commandHandlerContext = {\n dataStore: mockDataStore,\n queue: [],\n yieldedResults: [],\n };\n });\n\n it(\"should return the preimage when it is found and its length is within the maximum payload size\", () => {\n // given\n const requestHash = new Uint8Array(SHA256_SIZE).fill(0x01);\n const preimage = new Uint8Array([0xaa, 0xbb, 0xcc]);\n const preimageLength = preimage.length;\n\n // when\n (encodeVarint as jest.Mock).mockReturnValue({\n unsafeCoerce: () => new Uint8Array([0x03]), // varint for 3\n });\n\n mockDataStore.getPreimage.mockReturnValue(Just(preimage));\n\n const request = new Uint8Array([COMMAND_CODE, 0x00, ...requestHash]);\n\n const handlerResult = GetPreimageCommandHandler(\n request,\n commandHandlerContext,\n );\n\n const expectedResponse = new Uint8Array([0x03, 0x03, 0xaa, 0xbb, 0xcc]);\n\n // then\n expect(mockDataStore.getPreimage).toHaveBeenCalledWith(requestHash);\n expect(encodeVarint).toHaveBeenCalledWith(preimageLength);\n handlerResult.caseOf({\n Left: (_) => {\n throw new Error(\"Expected Right, got Left\");\n },\n Right: (response) => {\n expect(response).toEqual(expectedResponse);\n expect(commandHandlerContext.queue).toHaveLength(0);\n },\n });\n });\n\n it(\"should handle a preimage longer than the maximum payload size by queuing the remaining bytes\", () => {\n // given\n const requestHash = new Uint8Array(SHA256_SIZE).fill(0x02);\n const preimage = new Uint8Array(300).fill(0xff);\n const preimageLength = preimage.length;\n\n // when\n (encodeVarint as jest.Mock).mockReturnValue({\n unsafeCoerce: () => new Uint8Array([0xac, 0x02]),\n });\n\n mockDataStore.getPreimage.mockReturnValue(Just(preimage));\n\n const request = new Uint8Array([COMMAND_CODE, 0x00, ...requestHash]);\n\n const handlerResult = GetPreimageCommandHandler(\n request,\n commandHandlerContext,\n );\n\n const varintEncodedLength = new Uint8Array([0xac, 0x02]); // varint for 300\n const maximumBytesInResponse = Math.min(\n 255 - varintEncodedLength.length - 1,\n preimage.length,\n );\n const expectedResponse = new Uint8Array(\n varintEncodedLength.length + 1 + maximumBytesInResponse,\n );\n expectedResponse.set(varintEncodedLength, 0); // varint\n expectedResponse.set([maximumBytesInResponse], varintEncodedLength.length); // bytes in response\n expectedResponse.set(\n preimage.slice(0, maximumBytesInResponse),\n varintEncodedLength.length + 1,\n );\n\n // then\n expect(mockDataStore.getPreimage).toHaveBeenCalledWith(requestHash);\n expect(encodeVarint).toHaveBeenCalledWith(preimageLength);\n handlerResult.caseOf({\n Left: (_) => {\n throw new Error(\"Expected Right, got Left\");\n },\n Right: (response) => {\n expect(response).toEqual(expectedResponse);\n expect(commandHandlerContext.queue).toHaveLength(\n preimage.length - maximumBytesInResponse,\n );\n expect(commandHandlerContext.queue[0]).toEqual(new Uint8Array([0xff]));\n expect(\n commandHandlerContext.queue[commandHandlerContext.queue.length - 1],\n ).toEqual(new Uint8Array([0xff]));\n },\n });\n });\n\n it(\"should return an error when the preimage is not found\", () => {\n // given\n const requestHash = new Uint8Array(SHA256_SIZE).fill(0x03);\n\n // when\n mockDataStore.getPreimage.mockReturnValue(Nothing);\n\n const request = new Uint8Array([COMMAND_CODE, 0x00, ...requestHash]);\n\n const handlerResult = GetPreimageCommandHandler(\n request,\n commandHandlerContext,\n );\n\n // then\n expect(mockDataStore.getPreimage).toHaveBeenCalledWith(requestHash);\n expect(encodeVarint).not.toHaveBeenCalled();\n expect(commandHandlerContext.queue).toHaveLength(0);\n handlerResult.caseOf({\n Left: (error: DmkError) => {\n expect(error).toBeInstanceOf(ClientCommandHandlerError);\n },\n Right: (_) => {\n throw new Error(\"Expected Left, got Right\");\n },\n });\n });\n\n it(\"should handle a preimage length where the maximum payload size exactly matches the preimage length\", () => {\n // given\n const requestHash = new Uint8Array(SHA256_SIZE).fill(0x05);\n const preimage = new Uint8Array(252);\n preimage.fill(0x77);\n\n // when\n (encodeVarint as jest.Mock).mockReturnValue({\n unsafeCoerce: () => new Uint8Array([0xfc]),\n });\n\n mockDataStore.getPreimage.mockReturnValue(Just(preimage));\n\n const request = new Uint8Array([COMMAND_CODE, 0x00, ...requestHash]);\n\n const handlerResult = GetPreimageCommandHandler(\n request,\n commandHandlerContext,\n );\n\n const varintEncodedLength = new Uint8Array([0xfc]);\n const maximumBytesInResponse = Math.min(\n 255 - varintEncodedLength.length - 1,\n preimage.length,\n );\n const expectedResponse = new Uint8Array(\n varintEncodedLength.length + 1 + maximumBytesInResponse,\n );\n expectedResponse.set(varintEncodedLength, 0);\n expectedResponse.set([maximumBytesInResponse], varintEncodedLength.length);\n expectedResponse.set(preimage, varintEncodedLength.length + 1);\n\n // then\n expect(handlerResult).toStrictEqual(Either.of(expectedResponse));\n expect(commandHandlerContext.queue).toHaveLength(0);\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_purify_ts", "import_constants", "import_Varint", "import_Errors", "import_GetPreimageCommandHandler", "COMMAND_CODE", "commandHandlerContext", "mockDataStore", "requestHash", "preimage", "preimageLength", "request", "handlerResult", "expectedResponse", "_", "response", "varintEncodedLength", "maximumBytesInResponse", "error"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var E=Object.create;var p=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var H=Object.getPrototypeOf,M=Object.prototype.hasOwnProperty;var v=(n,t,o,l)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of y(t))!M.call(n,r)&&r!==o&&p(n,r,{get:()=>t[r],enumerable:!(l=x(t,r))||l.enumerable});return n};var C=(n,t,o)=>(o=n!=null?E(H(n)):{},v(t||!n||!n.__esModule?p(o,"default",{value:n,enumerable:!0}):o,n));var m=require("purify-ts"),u=require("../../../app-binder/command/client-command-handlers/Errors"),I=C(require("../../../app-binder/command/client-command-handlers/GetMerkleLeafIndexCommandHandler")),k=C(require("../../../app-binder/command/client-command-handlers/GetMerkleLeafProofCommandHandler")),L=C(require("../../../app-binder/command/client-command-handlers/GetMoreElementsCommandHandler")),g=C(require("../../../app-binder/command/client-command-handlers/GetPreimageCommandHandler")),A=C(require("../../../app-binder/command/client-command-handlers/YeldCommandHandler")),f=require("../../../app-binder/command/service/ClientCommandInterpreter"),i=require("../../../app-binder/command/utils/constants");describe("ClientCommandInterpreter",()=>{let n,t,o,l,r,s,c;beforeAll(()=>{o=vi.spyOn(A,"YieldCommandHandler").mockImplementation((e,a)=>(a.yieldedResults.push(e.slice(1)),(0,m.Right)(new Uint8Array([])))),l=vi.spyOn(g,"GetPreimageCommandHandler").mockImplementation((e,a)=>{const d=new Uint8Array([1,2,3]);return a.dataStore.getPreimage=vi.fn().mockReturnValue({isJust:()=>!0,extract:()=>d}),(0,m.Right)(d)}),r=vi.spyOn(k,"GetMerkleLeafProofCommandHandler").mockImplementation((e,a)=>(0,m.Right)(new Uint8Array([]))),s=vi.spyOn(I,"GetMerkleLeafIndexCommandHandler").mockImplementation((e,a)=>(a.dataStore.getMerkleLeafIndex=vi.fn().mockReturnValue({mapOrDefault:(d,B)=>d(42)}),(0,m.Right)(new Uint8Array([42])))),c=vi.spyOn(L,"GetMoreElementsCommandHandler").mockImplementation((e,a)=>a.queue.length===0?(0,m.Left)(new u.ClientCommandHandlerError("No more elements in queue")):(0,m.Right)(a.queue.shift()))}),beforeEach(()=>{n=new f.ClientCommandInterpreter,t={yieldedResults:[],dataStore:{getPreimage:vi.fn().mockReturnValue({isJust:()=>!1}),getMerkleLeafIndex:vi.fn()},queue:[new Uint8Array([1])]},vi.clearAllMocks()}),it("should call YieldCommandHandler when request code is YIELD",()=>{const e=new Uint8Array([i.ClientCommandCodes.YIELD]);n.getClientCommandPayload(e,t),expect(o).toHaveBeenCalledTimes(1),expect(o).toHaveBeenCalledWith(e,t)}),it("should call GetPreimageCommandHandler when request code is GET_PREIMAGE",()=>{const e=new Uint8Array([i.ClientCommandCodes.GET_PREIMAGE,0,...new Uint8Array(32)]);n.getClientCommandPayload(e,t),expect(l).toHaveBeenCalledTimes(1),expect(l).toHaveBeenCalledWith(e,t)}),it("should call GetMerkleLeafProofCommandHandler when request code is GET_MERKLE_LEAF_PROOF",()=>{const e=new Uint8Array([i.ClientCommandCodes.GET_MERKLE_LEAF_PROOF]);n.getClientCommandPayload(e,t),expect(r).toHaveBeenCalledTimes(1),expect(r).toHaveBeenCalledWith(e,t)}),it("should call GetMerkleLeafIndexCommandHandler when request code is GET_MERKLE_LEAF_INDEX",()=>{const e=new Uint8Array([i.ClientCommandCodes.GET_MERKLE_LEAF_INDEX,...new Uint8Array(64)]);n.getClientCommandPayload(e,t),expect(s).toHaveBeenCalledTimes(1),expect(s).toHaveBeenCalledWith(e,t)}),it("should call GetMoreElementsCommandHandler when request code is GET_MORE_ELEMENTS",()=>{const e=new Uint8Array([i.ClientCommandCodes.GET_MORE_ELEMENTS]);n.getClientCommandPayload(e,t),expect(c).toHaveBeenCalledTimes(1),expect(c).toHaveBeenCalledWith(e,t)}),it("should return an error for an unknown command code",()=>{const a=new Uint8Array([255]),d=n.getClientCommandPayload(a,t);expect(d.isLeft()).toBe(!0),expect(d.extract()).toBeInstanceOf(u.ClientCommandHandlerError),expect(o).not.toHaveBeenCalled(),expect(l).not.toHaveBeenCalled(),expect(r).not.toHaveBeenCalled(),expect(s).not.toHaveBeenCalled(),expect(c).not.toHaveBeenCalled()}),it("should return an error if no request code is present",()=>{const e=new Uint8Array([]),a=n.getClientCommandPayload(e,t);expect(a.isLeft()).toBe(!0),expect(a.extract()).toBeInstanceOf(u.ClientCommandHandlerError),expect(o).not.toHaveBeenCalled(),expect(l).not.toHaveBeenCalled(),expect(r).not.toHaveBeenCalled(),expect(s).not.toHaveBeenCalled(),expect(c).not.toHaveBeenCalled()})});
1
+ "use strict";var y=Object.create;var p=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var H=Object.getPrototypeOf,M=Object.prototype.hasOwnProperty;var I=(n,t,o,l)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of x(t))!M.call(n,r)&&r!==o&&p(n,r,{get:()=>t[r],enumerable:!(l=E(t,r))||l.enumerable});return n};var C=(n,t,o)=>(o=n!=null?y(H(n)):{},I(t||!n||!n.__esModule?p(o,"default",{value:n,enumerable:!0}):o,n));var m=require("purify-ts"),u=require("../../../app-binder/command/client-command-handlers/Errors"),L=C(require("../../../app-binder/command/client-command-handlers/GetMerkleLeafIndexCommandHandler")),g=C(require("../../../app-binder/command/client-command-handlers/GetMerkleLeafProofCommandHandler")),A=C(require("../../../app-binder/command/client-command-handlers/GetMoreElementsCommandHandler")),B=C(require("../../../app-binder/command/client-command-handlers/GetPreimageCommandHandler")),_=C(require("../../../app-binder/command/client-command-handlers/YeldCommandHandler")),f=require("../../../app-binder/command/service/ClientCommandInterpreter"),s=require("../../../app-binder/command/utils/constants");describe("ClientCommandInterpreter",()=>{let n,t,o,l,r,i,c;beforeAll(()=>{o=jest.spyOn(_,"YieldCommandHandler").mockImplementation((e,a)=>(a.yieldedResults.push(e.slice(1)),(0,m.Right)(new Uint8Array([])))),l=jest.spyOn(B,"GetPreimageCommandHandler").mockImplementation((e,a)=>{const d=new Uint8Array([1,2,3]);return a.dataStore.getPreimage=jest.fn().mockReturnValue({isJust:()=>!0,extract:()=>d}),(0,m.Right)(d)}),r=jest.spyOn(g,"GetMerkleLeafProofCommandHandler").mockImplementation((e,a)=>(0,m.Right)(new Uint8Array([]))),i=jest.spyOn(L,"GetMerkleLeafIndexCommandHandler").mockImplementation((e,a)=>(a.dataStore.getMerkleLeafIndex=jest.fn().mockReturnValue({mapOrDefault:(d,w)=>d(42)}),(0,m.Right)(new Uint8Array([42])))),c=jest.spyOn(A,"GetMoreElementsCommandHandler").mockImplementation((e,a)=>a.queue.length===0?(0,m.Left)(new u.ClientCommandHandlerError("No more elements in queue")):(0,m.Right)(a.queue.shift()))}),beforeEach(()=>{n=new f.ClientCommandInterpreter,t={yieldedResults:[],dataStore:{getPreimage:jest.fn().mockReturnValue({isJust:()=>!1}),getMerkleLeafIndex:jest.fn()},queue:[new Uint8Array([1])]},jest.clearAllMocks()}),it("should call YieldCommandHandler when request code is YIELD",()=>{const e=new Uint8Array([s.ClientCommandCodes.YIELD]);n.getClientCommandPayload(e,t),expect(o).toHaveBeenCalledTimes(1),expect(o).toHaveBeenCalledWith(e,t)}),it("should call GetPreimageCommandHandler when request code is GET_PREIMAGE",()=>{const e=new Uint8Array([s.ClientCommandCodes.GET_PREIMAGE,0,...new Uint8Array(32)]);n.getClientCommandPayload(e,t),expect(l).toHaveBeenCalledTimes(1),expect(l).toHaveBeenCalledWith(e,t)}),it("should call GetMerkleLeafProofCommandHandler when request code is GET_MERKLE_LEAF_PROOF",()=>{const e=new Uint8Array([s.ClientCommandCodes.GET_MERKLE_LEAF_PROOF]);n.getClientCommandPayload(e,t),expect(r).toHaveBeenCalledTimes(1),expect(r).toHaveBeenCalledWith(e,t)}),it("should call GetMerkleLeafIndexCommandHandler when request code is GET_MERKLE_LEAF_INDEX",()=>{const e=new Uint8Array([s.ClientCommandCodes.GET_MERKLE_LEAF_INDEX,...new Uint8Array(64)]);n.getClientCommandPayload(e,t),expect(i).toHaveBeenCalledTimes(1),expect(i).toHaveBeenCalledWith(e,t)}),it("should call GetMoreElementsCommandHandler when request code is GET_MORE_ELEMENTS",()=>{const e=new Uint8Array([s.ClientCommandCodes.GET_MORE_ELEMENTS]);n.getClientCommandPayload(e,t),expect(c).toHaveBeenCalledTimes(1),expect(c).toHaveBeenCalledWith(e,t)}),it("should return an error for an unknown command code",()=>{const a=new Uint8Array([255]),d=n.getClientCommandPayload(a,t);expect(d.isLeft()).toBe(!0),expect(d.extract()).toBeInstanceOf(u.ClientCommandHandlerError),expect(o).not.toHaveBeenCalled(),expect(l).not.toHaveBeenCalled(),expect(r).not.toHaveBeenCalled(),expect(i).not.toHaveBeenCalled(),expect(c).not.toHaveBeenCalled()}),it("should return an error if no request code is present",()=>{const e=new Uint8Array([]),a=n.getClientCommandPayload(e,t);expect(a.isLeft()).toBe(!0),expect(a.extract()).toBeInstanceOf(u.ClientCommandHandlerError),expect(o).not.toHaveBeenCalled(),expect(l).not.toHaveBeenCalled(),expect(r).not.toHaveBeenCalled(),expect(i).not.toHaveBeenCalled(),expect(c).not.toHaveBeenCalled()})});
2
2
  //# sourceMappingURL=ClientCommandInterpreter.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/app-binder/command/service/ClientCommandInterpreter.test.ts"],
4
- "sourcesContent": ["import { Left, Right } from \"purify-ts\";\nimport { type MockInstance } from \"vitest\";\n\nimport { type ClientCommandContext } from \"@internal/app-binder/command/client-command-handlers/ClientCommandHandlersTypes\";\nimport { ClientCommandHandlerError } from \"@internal/app-binder/command/client-command-handlers/Errors\";\nimport * as GetMerkleLeafIndexCommandHandlerModule from \"@internal/app-binder/command/client-command-handlers/GetMerkleLeafIndexCommandHandler\";\nimport * as GetMerkleLeafProofCommandHandlerModule from \"@internal/app-binder/command/client-command-handlers/GetMerkleLeafProofCommandHandler\";\nimport * as GetMoreElementsCommandHandlerModule from \"@internal/app-binder/command/client-command-handlers/GetMoreElementsCommandHandler\";\nimport * as GetPreimageCommandHandlerModule from \"@internal/app-binder/command/client-command-handlers/GetPreimageCommandHandler\";\nimport * as YieldCommandHandlerModule from \"@internal/app-binder/command/client-command-handlers/YeldCommandHandler\";\nimport { ClientCommandInterpreter } from \"@internal/app-binder/command/service/ClientCommandInterpreter\";\nimport { ClientCommandCodes } from \"@internal/app-binder/command/utils/constants\";\n\ndescribe(\"ClientCommandInterpreter\", () => {\n let interpreter: ClientCommandInterpreter;\n let context: ClientCommandContext;\n\n let yieldSpy: MockInstance;\n let getPreimageSpy: MockInstance;\n let getMerkleLeafProofSpy: MockInstance;\n let getMerkleLeafIndexSpy: MockInstance;\n let getMoreElementsSpy: MockInstance;\n\n beforeAll(() => {\n yieldSpy = vi\n .spyOn(YieldCommandHandlerModule, \"YieldCommandHandler\")\n .mockImplementation((request, ctx) => {\n ctx.yieldedResults.push(request.slice(1));\n return Right(new Uint8Array([]));\n });\n\n getPreimageSpy = vi\n .spyOn(GetPreimageCommandHandlerModule, \"GetPreimageCommandHandler\")\n .mockImplementation((_request, ctx) => {\n const preimage = new Uint8Array([1, 2, 3]);\n ctx.dataStore.getPreimage = vi\n .fn()\n .mockReturnValue({ isJust: () => true, extract: () => preimage });\n return Right(preimage);\n });\n\n getMerkleLeafProofSpy = vi\n .spyOn(\n GetMerkleLeafProofCommandHandlerModule,\n \"GetMerkleLeafProofCommandHandler\",\n )\n .mockImplementation((_request, _ctx) => {\n return Right(new Uint8Array([]));\n });\n\n getMerkleLeafIndexSpy = vi\n .spyOn(\n GetMerkleLeafIndexCommandHandlerModule,\n \"GetMerkleLeafIndexCommandHandler\",\n )\n .mockImplementation((_request, ctx) => {\n ctx.dataStore.getMerkleLeafIndex = vi.fn().mockReturnValue({\n mapOrDefault: (f: (idx: number) => Uint8Array, _def: Uint8Array) =>\n f(42),\n });\n return Right(new Uint8Array([42]));\n });\n\n getMoreElementsSpy = vi\n .spyOn(\n GetMoreElementsCommandHandlerModule,\n \"GetMoreElementsCommandHandler\",\n )\n .mockImplementation((_request, ctx) => {\n if (ctx.queue.length === 0) {\n return Left(\n new ClientCommandHandlerError(\"No more elements in queue\"),\n );\n }\n return Right(ctx.queue.shift()!);\n });\n });\n\n beforeEach(() => {\n interpreter = new ClientCommandInterpreter();\n context = {\n yieldedResults: [],\n dataStore: {\n getPreimage: vi.fn().mockReturnValue({ isJust: () => false }),\n getMerkleLeafIndex: vi.fn(),\n },\n queue: [new Uint8Array([0x01])],\n } as unknown as ClientCommandContext;\n\n vi.clearAllMocks();\n });\n\n it(\"should call YieldCommandHandler when request code is YIELD\", () => {\n //given\n const request = new Uint8Array([ClientCommandCodes.YIELD]);\n\n //when\n interpreter.getClientCommandPayload(request, context);\n\n //then\n expect(yieldSpy).toHaveBeenCalledTimes(1);\n expect(yieldSpy).toHaveBeenCalledWith(request, context);\n });\n\n it(\"should call GetPreimageCommandHandler when request code is GET_PREIMAGE\", () => {\n //given\n const request = new Uint8Array([\n ClientCommandCodes.GET_PREIMAGE,\n 0x00,\n ...new Uint8Array(32),\n ]);\n\n //when\n interpreter.getClientCommandPayload(request, context);\n\n //then\n expect(getPreimageSpy).toHaveBeenCalledTimes(1);\n expect(getPreimageSpy).toHaveBeenCalledWith(request, context);\n });\n\n it(\"should call GetMerkleLeafProofCommandHandler when request code is GET_MERKLE_LEAF_PROOF\", () => {\n //given\n const request = new Uint8Array([ClientCommandCodes.GET_MERKLE_LEAF_PROOF]);\n\n //when\n interpreter.getClientCommandPayload(request, context);\n\n //then\n expect(getMerkleLeafProofSpy).toHaveBeenCalledTimes(1);\n expect(getMerkleLeafProofSpy).toHaveBeenCalledWith(request, context);\n });\n\n it(\"should call GetMerkleLeafIndexCommandHandler when request code is GET_MERKLE_LEAF_INDEX\", () => {\n //given\n const request = new Uint8Array([\n ClientCommandCodes.GET_MERKLE_LEAF_INDEX,\n ...new Uint8Array(64),\n ]);\n\n //when\n interpreter.getClientCommandPayload(request, context);\n\n //then\n expect(getMerkleLeafIndexSpy).toHaveBeenCalledTimes(1);\n expect(getMerkleLeafIndexSpy).toHaveBeenCalledWith(request, context);\n });\n\n it(\"should call GetMoreElementsCommandHandler when request code is GET_MORE_ELEMENTS\", () => {\n //given\n const request = new Uint8Array([ClientCommandCodes.GET_MORE_ELEMENTS]);\n\n //when\n interpreter.getClientCommandPayload(request, context);\n\n //then\n expect(getMoreElementsSpy).toHaveBeenCalledTimes(1);\n expect(getMoreElementsSpy).toHaveBeenCalledWith(request, context);\n });\n\n it(\"should return an error for an unknown command code\", () => {\n //given\n const invalidCode = 0xff;\n const request = new Uint8Array([invalidCode]);\n\n //when\n const result = interpreter.getClientCommandPayload(request, context);\n\n //then\n expect(result.isLeft()).toBe(true);\n expect(result.extract()).toBeInstanceOf(ClientCommandHandlerError);\n expect(yieldSpy).not.toHaveBeenCalled();\n expect(getPreimageSpy).not.toHaveBeenCalled();\n expect(getMerkleLeafProofSpy).not.toHaveBeenCalled();\n expect(getMerkleLeafIndexSpy).not.toHaveBeenCalled();\n expect(getMoreElementsSpy).not.toHaveBeenCalled();\n });\n\n it(\"should return an error if no request code is present\", () => {\n //giuven\n const emptyRequest = new Uint8Array([]);\n\n //when\n const result = interpreter.getClientCommandPayload(emptyRequest, context);\n\n //then\n expect(result.isLeft()).toBe(true);\n expect(result.extract()).toBeInstanceOf(ClientCommandHandlerError);\n expect(yieldSpy).not.toHaveBeenCalled();\n expect(getPreimageSpy).not.toHaveBeenCalled();\n expect(getMerkleLeafProofSpy).not.toHaveBeenCalled();\n expect(getMerkleLeafIndexSpy).not.toHaveBeenCalled();\n expect(getMoreElementsSpy).not.toHaveBeenCalled();\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Left, Right } from \"purify-ts\";\n\nimport { type ClientCommandContext } from \"@internal/app-binder/command/client-command-handlers/ClientCommandHandlersTypes\";\nimport { ClientCommandHandlerError } from \"@internal/app-binder/command/client-command-handlers/Errors\";\nimport * as GetMerkleLeafIndexCommandHandlerModule from \"@internal/app-binder/command/client-command-handlers/GetMerkleLeafIndexCommandHandler\";\nimport * as GetMerkleLeafProofCommandHandlerModule from \"@internal/app-binder/command/client-command-handlers/GetMerkleLeafProofCommandHandler\";\nimport * as GetMoreElementsCommandHandlerModule from \"@internal/app-binder/command/client-command-handlers/GetMoreElementsCommandHandler\";\nimport * as GetPreimageCommandHandlerModule from \"@internal/app-binder/command/client-command-handlers/GetPreimageCommandHandler\";\nimport * as YieldCommandHandlerModule from \"@internal/app-binder/command/client-command-handlers/YeldCommandHandler\";\nimport { ClientCommandInterpreter } from \"@internal/app-binder/command/service/ClientCommandInterpreter\";\nimport { ClientCommandCodes } from \"@internal/app-binder/command/utils/constants\";\n\ndescribe(\"ClientCommandInterpreter\", () => {\n let interpreter: ClientCommandInterpreter;\n let context: ClientCommandContext;\n\n let yieldSpy: jest.SpyInstance;\n let getPreimageSpy: jest.SpyInstance;\n let getMerkleLeafProofSpy: jest.SpyInstance;\n let getMerkleLeafIndexSpy: jest.SpyInstance;\n let getMoreElementsSpy: jest.SpyInstance;\n\n beforeAll(() => {\n yieldSpy = jest\n .spyOn(YieldCommandHandlerModule, \"YieldCommandHandler\")\n .mockImplementation((request, ctx) => {\n ctx.yieldedResults.push(request.slice(1));\n return Right(new Uint8Array([]));\n });\n\n getPreimageSpy = jest\n .spyOn(GetPreimageCommandHandlerModule, \"GetPreimageCommandHandler\")\n .mockImplementation((_request, ctx) => {\n const preimage = new Uint8Array([1, 2, 3]);\n ctx.dataStore.getPreimage = jest\n .fn()\n .mockReturnValue({ isJust: () => true, extract: () => preimage });\n return Right(preimage);\n });\n\n getMerkleLeafProofSpy = jest\n .spyOn(\n GetMerkleLeafProofCommandHandlerModule,\n \"GetMerkleLeafProofCommandHandler\",\n )\n .mockImplementation((_request, _ctx) => {\n return Right(new Uint8Array([]));\n });\n\n getMerkleLeafIndexSpy = jest\n .spyOn(\n GetMerkleLeafIndexCommandHandlerModule,\n \"GetMerkleLeafIndexCommandHandler\",\n )\n .mockImplementation((_request, ctx) => {\n ctx.dataStore.getMerkleLeafIndex = jest.fn().mockReturnValue({\n mapOrDefault: (f: (idx: number) => Uint8Array, _def: Uint8Array) =>\n f(42),\n });\n return Right(new Uint8Array([42]));\n });\n\n getMoreElementsSpy = jest\n .spyOn(\n GetMoreElementsCommandHandlerModule,\n \"GetMoreElementsCommandHandler\",\n )\n .mockImplementation((_request, ctx) => {\n if (ctx.queue.length === 0) {\n return Left(\n new ClientCommandHandlerError(\"No more elements in queue\"),\n );\n }\n return Right(ctx.queue.shift()!);\n });\n });\n\n beforeEach(() => {\n interpreter = new ClientCommandInterpreter();\n context = {\n yieldedResults: [],\n dataStore: {\n getPreimage: jest.fn().mockReturnValue({ isJust: () => false }),\n getMerkleLeafIndex: jest.fn(),\n },\n queue: [new Uint8Array([0x01])],\n } as unknown as ClientCommandContext;\n\n jest.clearAllMocks();\n });\n\n it(\"should call YieldCommandHandler when request code is YIELD\", () => {\n //given\n const request = new Uint8Array([ClientCommandCodes.YIELD]);\n\n //when\n interpreter.getClientCommandPayload(request, context);\n\n //then\n expect(yieldSpy).toHaveBeenCalledTimes(1);\n expect(yieldSpy).toHaveBeenCalledWith(request, context);\n });\n\n it(\"should call GetPreimageCommandHandler when request code is GET_PREIMAGE\", () => {\n //given\n const request = new Uint8Array([\n ClientCommandCodes.GET_PREIMAGE,\n 0x00,\n ...new Uint8Array(32),\n ]);\n\n //when\n interpreter.getClientCommandPayload(request, context);\n\n //then\n expect(getPreimageSpy).toHaveBeenCalledTimes(1);\n expect(getPreimageSpy).toHaveBeenCalledWith(request, context);\n });\n\n it(\"should call GetMerkleLeafProofCommandHandler when request code is GET_MERKLE_LEAF_PROOF\", () => {\n //given\n const request = new Uint8Array([ClientCommandCodes.GET_MERKLE_LEAF_PROOF]);\n\n //when\n interpreter.getClientCommandPayload(request, context);\n\n //then\n expect(getMerkleLeafProofSpy).toHaveBeenCalledTimes(1);\n expect(getMerkleLeafProofSpy).toHaveBeenCalledWith(request, context);\n });\n\n it(\"should call GetMerkleLeafIndexCommandHandler when request code is GET_MERKLE_LEAF_INDEX\", () => {\n //given\n const request = new Uint8Array([\n ClientCommandCodes.GET_MERKLE_LEAF_INDEX,\n ...new Uint8Array(64),\n ]);\n\n //when\n interpreter.getClientCommandPayload(request, context);\n\n //then\n expect(getMerkleLeafIndexSpy).toHaveBeenCalledTimes(1);\n expect(getMerkleLeafIndexSpy).toHaveBeenCalledWith(request, context);\n });\n\n it(\"should call GetMoreElementsCommandHandler when request code is GET_MORE_ELEMENTS\", () => {\n //given\n const request = new Uint8Array([ClientCommandCodes.GET_MORE_ELEMENTS]);\n\n //when\n interpreter.getClientCommandPayload(request, context);\n\n //then\n expect(getMoreElementsSpy).toHaveBeenCalledTimes(1);\n expect(getMoreElementsSpy).toHaveBeenCalledWith(request, context);\n });\n\n it(\"should return an error for an unknown command code\", () => {\n //given\n const invalidCode = 0xff;\n const request = new Uint8Array([invalidCode]);\n\n //when\n const result = interpreter.getClientCommandPayload(request, context);\n\n //then\n expect(result.isLeft()).toBe(true);\n expect(result.extract()).toBeInstanceOf(ClientCommandHandlerError);\n expect(yieldSpy).not.toHaveBeenCalled();\n expect(getPreimageSpy).not.toHaveBeenCalled();\n expect(getMerkleLeafProofSpy).not.toHaveBeenCalled();\n expect(getMerkleLeafIndexSpy).not.toHaveBeenCalled();\n expect(getMoreElementsSpy).not.toHaveBeenCalled();\n });\n\n it(\"should return an error if no request code is present\", () => {\n //giuven\n const emptyRequest = new Uint8Array([]);\n\n //when\n const result = interpreter.getClientCommandPayload(emptyRequest, context);\n\n //then\n expect(result.isLeft()).toBe(true);\n expect(result.extract()).toBeInstanceOf(ClientCommandHandlerError);\n expect(yieldSpy).not.toHaveBeenCalled();\n expect(getPreimageSpy).not.toHaveBeenCalled();\n expect(getMerkleLeafProofSpy).not.toHaveBeenCalled();\n expect(getMerkleLeafIndexSpy).not.toHaveBeenCalled();\n expect(getMoreElementsSpy).not.toHaveBeenCalled();\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_purify_ts", "import_Errors", "GetMerkleLeafIndexCommandHandlerModule", "GetMerkleLeafProofCommandHandlerModule", "GetMoreElementsCommandHandlerModule", "GetPreimageCommandHandlerModule", "YieldCommandHandlerModule", "import_ClientCommandInterpreter", "import_constants", "interpreter", "context", "yieldSpy", "getPreimageSpy", "getMerkleLeafProofSpy", "getMerkleLeafIndexSpy", "getMoreElementsSpy", "request", "ctx", "_request", "preimage", "_ctx", "f", "_def", "result", "emptyRequest"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var t=require("@ledgerhq/device-management-kit"),r=require("./bitcoinAppErrors");describe("BtcAppCommandError",()=>{afterEach(()=>{vi.resetAllMocks()}),afterAll(()=>{vi.resetModules()}),it("should be an instance of DeviceExchangeError",()=>{const e=new r.BtcAppCommandError({message:"Test error message",errorCode:"6985"});expect(e).toBeInstanceOf(t.DeviceExchangeError)}),it("should set the correct message when provided",()=>{const e="Custom error message",o=new r.BtcAppCommandError({message:e,errorCode:"6985"});expect(o.message).toBe(e)}),it("should set the correct customErrorCode",()=>{const e="6a86",o=new r.BtcAppCommandError({message:"Either P1 or P2 is incorrect",errorCode:e});expect(o.errorCode).toBe(e)}),it("should correlate error codes with messages from bitcoinAppErrors",()=>{const e="6e00",o=r.BTC_APP_ERRORS[e].message,s=new r.BtcAppCommandError({message:o,errorCode:e});expect(s.errorCode).toBe(e),expect(s.message).toBe(o),expect(s).toBeInstanceOf(t.DeviceExchangeError)})});
1
+ "use strict";var t=require("@ledgerhq/device-management-kit"),r=require("./bitcoinAppErrors");describe("BtcAppCommandError",()=>{afterEach(()=>{jest.resetAllMocks()}),afterAll(()=>{jest.resetModules()}),it("should be an instance of DeviceExchangeError",()=>{const e=new r.BtcAppCommandError({message:"Test error message",errorCode:"6985"});expect(e).toBeInstanceOf(t.DeviceExchangeError)}),it("should set the correct message when provided",()=>{const e="Custom error message",o=new r.BtcAppCommandError({message:e,errorCode:"6985"});expect(o.message).toBe(e)}),it("should set the correct customErrorCode",()=>{const e="6a86",o=new r.BtcAppCommandError({message:"Either P1 or P2 is incorrect",errorCode:e});expect(o.errorCode).toBe(e)}),it("should correlate error codes with messages from bitcoinAppErrors",()=>{const e="6e00",o=r.BTC_APP_ERRORS[e].message,s=new r.BtcAppCommandError({message:o,errorCode:e});expect(s.errorCode).toBe(e),expect(s.message).toBe(o),expect(s).toBeInstanceOf(t.DeviceExchangeError)})});
2
2
  //# sourceMappingURL=bitcoinAppError.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/app-binder/command/utils/bitcoinAppError.test.ts"],
4
- "sourcesContent": ["import { DeviceExchangeError } from \"@ledgerhq/device-management-kit\";\n\nimport {\n BTC_APP_ERRORS,\n BtcAppCommandError,\n type BtcErrorCodes,\n} from \"./bitcoinAppErrors\";\n\ndescribe(\"BtcAppCommandError\", () => {\n afterEach(() => {\n vi.resetAllMocks();\n });\n\n afterAll(() => {\n vi.resetModules();\n });\n\n it(\"should be an instance of DeviceExchangeError\", () => {\n const error = new BtcAppCommandError({\n message: \"Test error message\",\n errorCode: \"6985\",\n });\n\n expect(error).toBeInstanceOf(DeviceExchangeError);\n });\n\n it(\"should set the correct message when provided\", () => {\n const customMessage = \"Custom error message\";\n const error = new BtcAppCommandError({\n message: customMessage,\n errorCode: \"6985\",\n });\n\n expect(error.message).toBe(customMessage);\n });\n\n it(\"should set the correct customErrorCode\", () => {\n const errorCode: BtcErrorCodes = \"6a86\";\n const error = new BtcAppCommandError({\n message: \"Either P1 or P2 is incorrect\",\n errorCode,\n });\n\n expect(error.errorCode).toBe(errorCode);\n });\n\n it(\"should correlate error codes with messages from bitcoinAppErrors\", () => {\n const errorCode: BtcErrorCodes = \"6e00\";\n const expectedMessage = BTC_APP_ERRORS[errorCode].message;\n\n const error = new BtcAppCommandError({\n message: expectedMessage,\n errorCode,\n });\n\n expect(error.errorCode).toBe(errorCode);\n expect(error.message).toBe(expectedMessage);\n\n expect(error).toBeInstanceOf(DeviceExchangeError);\n });\n});\n"],
5
- "mappings": "aAAA,IAAAA,EAAoC,2CAEpCC,EAIO,8BAEP,SAAS,qBAAsB,IAAM,CACnC,UAAU,IAAM,CACd,GAAG,cAAc,CACnB,CAAC,EAED,SAAS,IAAM,CACb,GAAG,aAAa,CAClB,CAAC,EAED,GAAG,+CAAgD,IAAM,CACvD,MAAMC,EAAQ,IAAI,qBAAmB,CACnC,QAAS,qBACT,UAAW,MACb,CAAC,EAED,OAAOA,CAAK,EAAE,eAAe,qBAAmB,CAClD,CAAC,EAED,GAAG,+CAAgD,IAAM,CACvD,MAAMC,EAAgB,uBAChBD,EAAQ,IAAI,qBAAmB,CACnC,QAASC,EACT,UAAW,MACb,CAAC,EAED,OAAOD,EAAM,OAAO,EAAE,KAAKC,CAAa,CAC1C,CAAC,EAED,GAAG,yCAA0C,IAAM,CACjD,MAAMC,EAA2B,OAC3BF,EAAQ,IAAI,qBAAmB,CACnC,QAAS,+BACT,UAAAE,CACF,CAAC,EAED,OAAOF,EAAM,SAAS,EAAE,KAAKE,CAAS,CACxC,CAAC,EAED,GAAG,mEAAoE,IAAM,CAC3E,MAAMA,EAA2B,OAC3BC,EAAkB,iBAAeD,CAAS,EAAE,QAE5CF,EAAQ,IAAI,qBAAmB,CACnC,QAASG,EACT,UAAAD,CACF,CAAC,EAED,OAAOF,EAAM,SAAS,EAAE,KAAKE,CAAS,EACtC,OAAOF,EAAM,OAAO,EAAE,KAAKG,CAAe,EAE1C,OAAOH,CAAK,EAAE,eAAe,qBAAmB,CAClD,CAAC,CACH,CAAC",
4
+ "sourcesContent": ["import { DeviceExchangeError } from \"@ledgerhq/device-management-kit\";\n\nimport {\n BTC_APP_ERRORS,\n BtcAppCommandError,\n type BtcErrorCodes,\n} from \"./bitcoinAppErrors\";\n\ndescribe(\"BtcAppCommandError\", () => {\n afterEach(() => {\n jest.resetAllMocks();\n });\n\n afterAll(() => {\n jest.resetModules();\n });\n\n it(\"should be an instance of DeviceExchangeError\", () => {\n const error = new BtcAppCommandError({\n message: \"Test error message\",\n errorCode: \"6985\",\n });\n\n expect(error).toBeInstanceOf(DeviceExchangeError);\n });\n\n it(\"should set the correct message when provided\", () => {\n const customMessage = \"Custom error message\";\n const error = new BtcAppCommandError({\n message: customMessage,\n errorCode: \"6985\",\n });\n\n expect(error.message).toBe(customMessage);\n });\n\n it(\"should set the correct customErrorCode\", () => {\n const errorCode: BtcErrorCodes = \"6a86\";\n const error = new BtcAppCommandError({\n message: \"Either P1 or P2 is incorrect\",\n errorCode,\n });\n\n expect(error.errorCode).toBe(errorCode);\n });\n\n it(\"should correlate error codes with messages from bitcoinAppErrors\", () => {\n const errorCode: BtcErrorCodes = \"6e00\";\n const expectedMessage = BTC_APP_ERRORS[errorCode].message;\n\n const error = new BtcAppCommandError({\n message: expectedMessage,\n errorCode,\n });\n\n expect(error.errorCode).toBe(errorCode);\n expect(error.message).toBe(expectedMessage);\n\n expect(error).toBeInstanceOf(DeviceExchangeError);\n });\n});\n"],
5
+ "mappings": "aAAA,IAAAA,EAAoC,2CAEpCC,EAIO,8BAEP,SAAS,qBAAsB,IAAM,CACnC,UAAU,IAAM,CACd,KAAK,cAAc,CACrB,CAAC,EAED,SAAS,IAAM,CACb,KAAK,aAAa,CACpB,CAAC,EAED,GAAG,+CAAgD,IAAM,CACvD,MAAMC,EAAQ,IAAI,qBAAmB,CACnC,QAAS,qBACT,UAAW,MACb,CAAC,EAED,OAAOA,CAAK,EAAE,eAAe,qBAAmB,CAClD,CAAC,EAED,GAAG,+CAAgD,IAAM,CACvD,MAAMC,EAAgB,uBAChBD,EAAQ,IAAI,qBAAmB,CACnC,QAASC,EACT,UAAW,MACb,CAAC,EAED,OAAOD,EAAM,OAAO,EAAE,KAAKC,CAAa,CAC1C,CAAC,EAED,GAAG,yCAA0C,IAAM,CACjD,MAAMC,EAA2B,OAC3BF,EAAQ,IAAI,qBAAmB,CACnC,QAAS,+BACT,UAAAE,CACF,CAAC,EAED,OAAOF,EAAM,SAAS,EAAE,KAAKE,CAAS,CACxC,CAAC,EAED,GAAG,mEAAoE,IAAM,CAC3E,MAAMA,EAA2B,OAC3BC,EAAkB,iBAAeD,CAAS,EAAE,QAE5CF,EAAQ,IAAI,qBAAmB,CACnC,QAASG,EACT,UAAAD,CACF,CAAC,EAED,OAAOF,EAAM,SAAS,EAAE,KAAKE,CAAS,EACtC,OAAOF,EAAM,OAAO,EAAE,KAAKG,CAAe,EAE1C,OAAOH,CAAK,EAAE,eAAe,qBAAmB,CAClD,CAAC,CACH,CAAC",
6
6
  "names": ["import_device_management_kit", "import_bitcoinAppErrors", "error", "customMessage", "errorCode", "expectedMessage"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("@ledgerhq/device-management-kit"),o=require("../../../app-binder/device-action/__test-utils__/makeInternalApi"),l=require("../../../app-binder/device-action/__test-utils__/setupOpenAppDAMock"),d=require("../../../app-binder/device-action/__test-utils__/testDeviceActionStates"),c=require("./GetWalletAddressDeviceAction");vi.mock("@ledgerhq/device-management-kit",async i=>({...await i(),OpenAppDeviceAction:vi.fn(()=>({makeStateMachine:vi.fn()}))}));describe("GetWalletAddressDeviceAction",()=>{const i=vi.fn(),s=vi.fn();function u(){return{prepareWalletPolicy:i,getWalletAddress:s}}describe("Success case",()=>{it("should call external dependencies with the correct parameters",()=>new Promise((a,n)=>{(0,l.setupOpenAppDAMock)();const t=new c.GetWalletAddressDeviceAction({input:{wallet:"ApiWallet",walletBuilder:"WalletBuilder",walletSerializer:"WalletSerializer",dataStoreService:"DataStoreService",checkOnDevice:!0,change:!1,addressIndex:1}});vi.spyOn(t,"extractDependencies").mockReturnValue(u()),i.mockResolvedValueOnce((0,e.CommandResultFactory)({data:"InternalWallet"})),s.mockResolvedValueOnce((0,e.CommandResultFactory)({data:"WalletAddress"}));const r=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.VerifyAddress},status:e.DeviceActionStatus.Pending},{output:"WalletAddress",status:e.DeviceActionStatus.Completed}];(0,d.testDeviceActionStates)(t,r,(0,o.makeDeviceActionInternalApiMock)(),{onDone:a,onError:n})}))}),describe("Error cases",()=>{beforeEach(()=>{vi.resetAllMocks()}),it("Error if open app fails",()=>new Promise((a,n)=>{(0,l.setupOpenAppDAMock)(new e.UnknownDeviceExchangeError("Mocked error"));const t=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Error,error:new e.UnknownDeviceExchangeError("Mocked error")}],r=new c.GetWalletAddressDeviceAction({input:{wallet:{},walletBuilder:{},walletSerializer:{},dataStoreService:{},checkOnDevice:!0,change:!1,addressIndex:1}});vi.spyOn(r,"extractDependencies").mockReturnValue(u()),(0,d.testDeviceActionStates)(r,t,(0,o.makeDeviceActionInternalApiMock)(),{onDone:a,onError:n}),expect(s).not.toHaveBeenCalled()})),it("Error if prepareWalletPolicy fails",()=>new Promise((a,n)=>{(0,l.setupOpenAppDAMock)();const t=new c.GetWalletAddressDeviceAction({input:{wallet:{},walletBuilder:{},walletSerializer:{},dataStoreService:{},checkOnDevice:!0,change:!1,addressIndex:1}});vi.spyOn(t,"extractDependencies").mockReturnValue(u()),i.mockResolvedValueOnce((0,e.CommandResultFactory)({error:new e.UnknownDeviceExchangeError("Mocked error")}));const r=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Error,error:new e.UnknownDeviceExchangeError("Mocked error")}];(0,d.testDeviceActionStates)(t,r,(0,o.makeDeviceActionInternalApiMock)(),{onDone:a,onError:n}),expect(s).not.toHaveBeenCalled()})),it("Error if getWalletAddress fails",()=>new Promise((a,n)=>{(0,l.setupOpenAppDAMock)();const t=new c.GetWalletAddressDeviceAction({input:{wallet:{},walletBuilder:{},walletSerializer:{},dataStoreService:{},checkOnDevice:!0,change:!1,addressIndex:1}});vi.spyOn(t,"extractDependencies").mockReturnValue(u()),i.mockResolvedValueOnce((0,e.CommandResultFactory)({data:"InternalWallet"})),s.mockResolvedValueOnce((0,e.CommandResultFactory)({error:new e.UnknownDeviceExchangeError("Mocked error")}));const r=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.VerifyAddress}},{status:e.DeviceActionStatus.Error,error:new e.UnknownDeviceExchangeError("Mocked error")}];(0,d.testDeviceActionStates)(t,r,(0,o.makeDeviceActionInternalApiMock)(),{onDone:a,onError:n})}))})});
1
+ "use strict";var e=require("@ledgerhq/device-management-kit"),i=require("../../../app-binder/device-action/__test-utils__/makeInternalApi"),s=require("../../../app-binder/device-action/__test-utils__/setupOpenAppDAMock"),l=require("../../../app-binder/device-action/__test-utils__/testDeviceActionStates"),o=require("./GetWalletAddressDeviceAction");jest.mock("@ledgerhq/device-management-kit",()=>({...jest.requireActual("@ledgerhq/device-management-kit"),OpenAppDeviceAction:jest.fn(()=>({makeStateMachine:jest.fn()}))}));describe("GetWalletAddressDeviceAction",()=>{const d=jest.fn(),n=jest.fn();function c(){return{prepareWalletPolicy:d,getWalletAddress:n}}describe("Success case",()=>{it("should call external dependencies with the correct parameters",a=>{(0,s.setupOpenAppDAMock)();const t=new o.GetWalletAddressDeviceAction({input:{wallet:"ApiWallet",walletBuilder:"WalletBuilder",walletSerializer:"WalletSerializer",dataStoreService:"DataStoreService",checkOnDevice:!0,change:!1,addressIndex:1}});jest.spyOn(t,"extractDependencies").mockReturnValue(c()),d.mockResolvedValueOnce((0,e.CommandResultFactory)({data:"InternalWallet"})),n.mockResolvedValueOnce((0,e.CommandResultFactory)({data:"WalletAddress"}));const r=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.VerifyAddress},status:e.DeviceActionStatus.Pending},{output:"WalletAddress",status:e.DeviceActionStatus.Completed}];(0,l.testDeviceActionStates)(t,r,(0,i.makeDeviceActionInternalApiMock)(),a)})}),describe("Error cases",()=>{beforeEach(()=>{jest.resetAllMocks()}),it("Error if open app fails",a=>{(0,s.setupOpenAppDAMock)(new e.UnknownDeviceExchangeError("Mocked error"));const t=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Error,error:new e.UnknownDeviceExchangeError("Mocked error")}],r=new o.GetWalletAddressDeviceAction({input:{wallet:{},walletBuilder:{},walletSerializer:{},dataStoreService:{},checkOnDevice:!0,change:!1,addressIndex:1}});jest.spyOn(r,"extractDependencies").mockReturnValue(c()),(0,l.testDeviceActionStates)(r,t,(0,i.makeDeviceActionInternalApiMock)(),a),expect(n).not.toHaveBeenCalled()}),it("Error if prepareWalletPolicy fails",a=>{(0,s.setupOpenAppDAMock)();const t=new o.GetWalletAddressDeviceAction({input:{wallet:{},walletBuilder:{},walletSerializer:{},dataStoreService:{},checkOnDevice:!0,change:!1,addressIndex:1}});jest.spyOn(t,"extractDependencies").mockReturnValue(c()),d.mockResolvedValueOnce((0,e.CommandResultFactory)({error:new e.UnknownDeviceExchangeError("Mocked error")}));const r=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Error,error:new e.UnknownDeviceExchangeError("Mocked error")}];(0,l.testDeviceActionStates)(t,r,(0,i.makeDeviceActionInternalApiMock)(),a),expect(n).not.toHaveBeenCalled()}),it("Error if getWalletAddress fails",a=>{(0,s.setupOpenAppDAMock)();const t=new o.GetWalletAddressDeviceAction({input:{wallet:{},walletBuilder:{},walletSerializer:{},dataStoreService:{},checkOnDevice:!0,change:!1,addressIndex:1}});jest.spyOn(t,"extractDependencies").mockReturnValue(c()),d.mockResolvedValueOnce((0,e.CommandResultFactory)({data:"InternalWallet"})),n.mockResolvedValueOnce((0,e.CommandResultFactory)({error:new e.UnknownDeviceExchangeError("Mocked error")}));const r=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.VerifyAddress}},{status:e.DeviceActionStatus.Error,error:new e.UnknownDeviceExchangeError("Mocked error")}];(0,l.testDeviceActionStates)(t,r,(0,i.makeDeviceActionInternalApiMock)(),a)})})});
2
2
  //# sourceMappingURL=GetWalletAddressDeviceAction.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/app-binder/device-action/GetWalletAddress/GetWalletAddressDeviceAction.test.ts"],
4
- "sourcesContent": ["/* eslint @typescript-eslint/consistent-type-imports: off */\nimport {\n CommandResultFactory,\n DeviceActionStatus,\n UnknownDeviceExchangeError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type GetWalletAddressDAState } from \"@api/app-binder/GetWalletAddressDeviceActionTypes\";\nimport { type RegisteredWallet, type WalletAddress } from \"@api/model/Wallet\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupOpenAppDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { type DataStoreService } from \"@internal/data-store/service/DataStoreService\";\nimport { type WalletBuilder } from \"@internal/wallet/service/WalletBuilder\";\nimport { type WalletSerializer } from \"@internal/wallet/service/WalletSerializer\";\n\nimport { GetWalletAddressDeviceAction } from \"./GetWalletAddressDeviceAction\";\n\nvi.mock(\"@ledgerhq/device-management-kit\", async (importOriginal) => {\n const original =\n await importOriginal<typeof import(\"@ledgerhq/device-management-kit\")>();\n return {\n ...original,\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\ndescribe(\"GetWalletAddressDeviceAction\", () => {\n const prepareWalletPolicyMock = vi.fn();\n const getWalletAddressMock = vi.fn();\n\n function extractDependenciesMock() {\n return {\n prepareWalletPolicy: prepareWalletPolicyMock,\n getWalletAddress: getWalletAddressMock,\n };\n }\n\n describe(\"Success case\", () => {\n it(\"should call external dependencies with the correct parameters\", () =>\n new Promise<void>((resolve, reject) => {\n // given\n setupOpenAppDAMock();\n\n const deviceAction = new GetWalletAddressDeviceAction({\n input: {\n wallet: \"ApiWallet\" as unknown as RegisteredWallet,\n walletBuilder: \"WalletBuilder\" as unknown as WalletBuilder,\n walletSerializer: \"WalletSerializer\" as unknown as WalletSerializer,\n dataStoreService: \"DataStoreService\" as unknown as DataStoreService,\n checkOnDevice: true,\n change: false,\n addressIndex: 1,\n },\n });\n\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n prepareWalletPolicyMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: \"InternalWallet\",\n }),\n );\n getWalletAddressMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: \"WalletAddress\",\n }),\n );\n\n const expectedStates: Array<GetWalletAddressDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.VerifyAddress,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: \"WalletAddress\" as unknown as WalletAddress,\n status: DeviceActionStatus.Completed,\n },\n ];\n\n // then\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n });\n\n describe(\"Error cases\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n it(\"Error if open app fails\", () =>\n new Promise<void>((resolve, reject) => {\n // given\n setupOpenAppDAMock(new UnknownDeviceExchangeError(\"Mocked error\"));\n\n const expectedStates: Array<GetWalletAddressDAState> = [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDeviceExchangeError(\"Mocked error\"),\n },\n ];\n\n const deviceAction = new GetWalletAddressDeviceAction({\n input: {\n wallet: {} as unknown as RegisteredWallet,\n walletBuilder: {} as WalletBuilder,\n walletSerializer: {} as WalletSerializer,\n dataStoreService: {} as DataStoreService,\n checkOnDevice: true,\n change: false,\n addressIndex: 1,\n },\n });\n\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n\n // then\n expect(getWalletAddressMock).not.toHaveBeenCalled();\n }));\n\n it(\"Error if prepareWalletPolicy fails\", () =>\n new Promise<void>((resolve, reject) => {\n // given\n setupOpenAppDAMock();\n\n const deviceAction = new GetWalletAddressDeviceAction({\n input: {\n wallet: {} as unknown as RegisteredWallet,\n walletBuilder: {} as WalletBuilder,\n walletSerializer: {} as WalletSerializer,\n dataStoreService: {} as DataStoreService,\n checkOnDevice: true,\n change: false,\n addressIndex: 1,\n },\n });\n\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n prepareWalletPolicyMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new UnknownDeviceExchangeError(\"Mocked error\"),\n }),\n );\n\n const expectedStates: Array<GetWalletAddressDAState> = [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDeviceExchangeError(\"Mocked error\"),\n },\n ];\n\n // then\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n\n expect(getWalletAddressMock).not.toHaveBeenCalled();\n }));\n\n it(\"Error if getWalletAddress fails\", () =>\n new Promise<void>((resolve, reject) => {\n // given\n setupOpenAppDAMock();\n\n const deviceAction = new GetWalletAddressDeviceAction({\n input: {\n wallet: {} as unknown as RegisteredWallet,\n walletBuilder: {} as WalletBuilder,\n walletSerializer: {} as WalletSerializer,\n dataStoreService: {} as DataStoreService,\n checkOnDevice: true,\n change: false,\n addressIndex: 1,\n },\n });\n\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n prepareWalletPolicyMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: \"InternalWallet\",\n }),\n );\n getWalletAddressMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new UnknownDeviceExchangeError(\"Mocked error\"),\n }),\n );\n\n const expectedStates: Array<GetWalletAddressDAState> = [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.VerifyAddress,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDeviceExchangeError(\"Mocked error\"),\n },\n ];\n\n // then\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_device_management_kit", "import_makeInternalApi", "import_setupOpenAppDAMock", "import_testDeviceActionStates", "import_GetWalletAddressDeviceAction", "importOriginal", "prepareWalletPolicyMock", "getWalletAddressMock", "extractDependenciesMock", "resolve", "reject", "deviceAction", "expectedStates"]
4
+ "sourcesContent": ["import {\n CommandResultFactory,\n DeviceActionStatus,\n UnknownDeviceExchangeError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type GetWalletAddressDAState } from \"@api/app-binder/GetWalletAddressDeviceActionTypes\";\nimport { type RegisteredWallet, type WalletAddress } from \"@api/model/Wallet\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupOpenAppDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { type DataStoreService } from \"@internal/data-store/service/DataStoreService\";\nimport { type WalletBuilder } from \"@internal/wallet/service/WalletBuilder\";\nimport { type WalletSerializer } from \"@internal/wallet/service/WalletSerializer\";\n\nimport { GetWalletAddressDeviceAction } from \"./GetWalletAddressDeviceAction\";\n\njest.mock(\"@ledgerhq/device-management-kit\", () => ({\n ...jest.requireActual(\"@ledgerhq/device-management-kit\"),\n OpenAppDeviceAction: jest.fn(() => ({\n makeStateMachine: jest.fn(),\n })),\n}));\n\ndescribe(\"GetWalletAddressDeviceAction\", () => {\n const prepareWalletPolicyMock = jest.fn();\n const getWalletAddressMock = jest.fn();\n\n function extractDependenciesMock() {\n return {\n prepareWalletPolicy: prepareWalletPolicyMock,\n getWalletAddress: getWalletAddressMock,\n };\n }\n\n describe(\"Success case\", () => {\n it(\"should call external dependencies with the correct parameters\", (done) => {\n // given\n setupOpenAppDAMock();\n\n const deviceAction = new GetWalletAddressDeviceAction({\n input: {\n wallet: \"ApiWallet\" as unknown as RegisteredWallet,\n walletBuilder: \"WalletBuilder\" as unknown as WalletBuilder,\n walletSerializer: \"WalletSerializer\" as unknown as WalletSerializer,\n dataStoreService: \"DataStoreService\" as unknown as DataStoreService,\n checkOnDevice: true,\n change: false,\n addressIndex: 1,\n },\n });\n\n jest\n .spyOn(deviceAction, \"extractDependencies\")\n .mockReturnValue(extractDependenciesMock());\n prepareWalletPolicyMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: \"InternalWallet\",\n }),\n );\n getWalletAddressMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: \"WalletAddress\",\n }),\n );\n\n const expectedStates: Array<GetWalletAddressDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.VerifyAddress,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: \"WalletAddress\" as unknown as WalletAddress,\n status: DeviceActionStatus.Completed,\n },\n ];\n\n // then\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n done,\n );\n });\n });\n\n describe(\"Error cases\", () => {\n beforeEach(() => {\n jest.resetAllMocks();\n });\n\n it(\"Error if open app fails\", (done) => {\n // given\n setupOpenAppDAMock(new UnknownDeviceExchangeError(\"Mocked error\"));\n\n const expectedStates: Array<GetWalletAddressDAState> = [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDeviceExchangeError(\"Mocked error\"),\n },\n ];\n\n const deviceAction = new GetWalletAddressDeviceAction({\n input: {\n wallet: {} as unknown as RegisteredWallet,\n walletBuilder: {} as WalletBuilder,\n walletSerializer: {} as WalletSerializer,\n dataStoreService: {} as DataStoreService,\n checkOnDevice: true,\n change: false,\n addressIndex: 1,\n },\n });\n\n jest\n .spyOn(deviceAction, \"extractDependencies\")\n .mockReturnValue(extractDependenciesMock());\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n done,\n );\n\n // then\n expect(getWalletAddressMock).not.toHaveBeenCalled();\n });\n\n it(\"Error if prepareWalletPolicy fails\", (done) => {\n // given\n setupOpenAppDAMock();\n\n const deviceAction = new GetWalletAddressDeviceAction({\n input: {\n wallet: {} as unknown as RegisteredWallet,\n walletBuilder: {} as WalletBuilder,\n walletSerializer: {} as WalletSerializer,\n dataStoreService: {} as DataStoreService,\n checkOnDevice: true,\n change: false,\n addressIndex: 1,\n },\n });\n\n jest\n .spyOn(deviceAction, \"extractDependencies\")\n .mockReturnValue(extractDependenciesMock());\n prepareWalletPolicyMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new UnknownDeviceExchangeError(\"Mocked error\"),\n }),\n );\n\n const expectedStates: Array<GetWalletAddressDAState> = [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDeviceExchangeError(\"Mocked error\"),\n },\n ];\n\n // then\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n done,\n );\n\n expect(getWalletAddressMock).not.toHaveBeenCalled();\n });\n\n it(\"Error if getWalletAddress fails\", (done) => {\n // given\n setupOpenAppDAMock();\n\n const deviceAction = new GetWalletAddressDeviceAction({\n input: {\n wallet: {} as unknown as RegisteredWallet,\n walletBuilder: {} as WalletBuilder,\n walletSerializer: {} as WalletSerializer,\n dataStoreService: {} as DataStoreService,\n checkOnDevice: true,\n change: false,\n addressIndex: 1,\n },\n });\n\n jest\n .spyOn(deviceAction, \"extractDependencies\")\n .mockReturnValue(extractDependenciesMock());\n prepareWalletPolicyMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: \"InternalWallet\",\n }),\n );\n getWalletAddressMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new UnknownDeviceExchangeError(\"Mocked error\"),\n }),\n );\n\n const expectedStates: Array<GetWalletAddressDAState> = [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.VerifyAddress,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDeviceExchangeError(\"Mocked error\"),\n },\n ];\n\n // then\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n done,\n );\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_device_management_kit", "import_makeInternalApi", "import_setupOpenAppDAMock", "import_testDeviceActionStates", "import_GetWalletAddressDeviceAction", "prepareWalletPolicyMock", "getWalletAddressMock", "extractDependenciesMock", "done", "deviceAction", "expectedStates"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var g=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var M=Object.prototype.hasOwnProperty;var d=(i,t)=>{for(var s in t)g(i,s,{get:t[s],enumerable:!0})},A=(i,t,s,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of l(t))!M.call(i,a)&&a!==s&&g(i,a,{get:()=>t[a],enumerable:!(e=u(t,a))||e.enumerable});return i};var m=i=>A(g({},"__esModule",{value:!0}),i);var y={};d(y,{SignMessageDeviceAction:()=>D});module.exports=m(y);var n=require("@ledgerhq/device-management-kit"),o=require("purify-ts"),r=require("xstate"),p=require("../../../app-binder/task/SignMessageTask");class D extends n.XStateDeviceAction{makeStateMachine(t){const{signMessage:s}=this.extractDependencies(t);return(0,r.setup)({types:{input:{},context:{},output:{}},actors:{openAppStateMachine:new n.OpenAppDeviceAction({input:{appName:"Bitcoin"}}).makeStateMachine(t),signMessage:(0,r.fromPromise)(s)},guards:{noInternalError:({context:e})=>e._internalState.error===null},actions:{assignErrorFromEvent:(0,r.assign)({_internalState:e=>({...e.context._internalState,error:e.event.error})})}}).createMachine({id:"SignMessageDeviceAction",initial:"OpenAppDeviceAction",context:({input:e})=>({input:e,intermediateValue:{requiredUserInteraction:n.UserInteractionRequired.None},_internalState:{error:null,signature:null}}),states:{OpenAppDeviceAction:{exit:(0,r.assign)({intermediateValue:{requiredUserInteraction:n.UserInteractionRequired.None}}),invoke:{id:"openAppStateMachine",input:{appName:"Bitcoin"},src:"openAppStateMachine",onSnapshot:{actions:(0,r.assign)({intermediateValue:e=>e.event.snapshot.context.intermediateValue})},onDone:{actions:(0,r.assign)({_internalState:e=>e.event.output.caseOf({Right:()=>e.context._internalState,Left:a=>({...e.context._internalState,error:a})})}),target:"CheckOpenAppDeviceActionResult"}}},CheckOpenAppDeviceActionResult:{always:[{target:"SignMessage",guard:"noInternalError"},"Error"]},SignMessage:{entry:(0,r.assign)({intermediateValue:{requiredUserInteraction:n.UserInteractionRequired.SignPersonalMessage}}),exit:(0,r.assign)({intermediateValue:{requiredUserInteraction:n.UserInteractionRequired.None}}),invoke:{id:"signMessage",src:"signMessage",input:({context:e})=>({derivationPath:e.input.derivationPath,message:e.input.message,dataStoreService:e.input.dataStoreService}),onDone:{target:"SignMessageResultCheck",actions:[(0,r.assign)({_internalState:({event:e,context:a})=>(0,n.isSuccessCommandResult)(e.output)?{...a._internalState,signature:e.output.data}:{...a._internalState,error:e.output.error}})]},onError:{target:"Error",actions:"assignErrorFromEvent"}}},SignMessageResultCheck:{always:[{guard:"noInternalError",target:"Success"},{target:"Error"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:e})=>e._internalState.signature?(0,o.Right)(e._internalState.signature):(0,o.Left)(e._internalState.error||new n.UnknownDAError("No error in final state"))})}extractDependencies(t){return{signMessage:async e=>{const{input:{derivationPath:a,message:c,dataStoreService:S}}=e;return new p.SendSignMessageTask(t,{derivationPath:a,message:c},S).run()}}}}0&&(module.exports={SignMessageDeviceAction});
2
+ //# sourceMappingURL=SignMessageDeviceAction.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.ts"],
4
+ "sourcesContent": ["import {\n type CommandResult,\n type DeviceActionStateMachine,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignMessageDAError,\n type SignMessageDAInput,\n type SignMessageDAIntermediateValue,\n type SignMessageDAInternalState,\n type SignMessageDAOutput,\n} from \"@api/app-binder/SignMessageDeviceActionTypes\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { type BtcErrorCodes } from \"@internal/app-binder/command/utils/bitcoinAppErrors\";\nimport {\n SendSignMessageTask,\n type SendSignMessageTaskArgs,\n} from \"@internal/app-binder/task/SignMessageTask\";\nimport { type DataStoreService } from \"@internal/data-store/service/DataStoreService\";\n\nexport type MachineDependencies = {\n readonly signMessage: (arg0: {\n input: SendSignMessageTaskArgs & { dataStoreService: DataStoreService };\n }) => Promise<CommandResult<Signature, BtcErrorCodes>>;\n};\n\nexport type ExtractMachineDependencies = (\n internalApi: InternalApi,\n) => MachineDependencies;\n\nexport class SignMessageDeviceAction extends XStateDeviceAction<\n SignMessageDAOutput,\n SignMessageDAInput,\n SignMessageDAError,\n SignMessageDAIntermediateValue,\n SignMessageDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignMessageDAOutput,\n SignMessageDAInput,\n SignMessageDAError,\n SignMessageDAIntermediateValue,\n SignMessageDAInternalState\n > {\n type types = StateMachineTypes<\n SignMessageDAOutput,\n SignMessageDAInput,\n SignMessageDAError,\n SignMessageDAIntermediateValue,\n SignMessageDAInternalState\n >;\n\n const { signMessage } = this.extractDependencies(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 openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Bitcoin\" },\n }).makeStateMachine(internalApi),\n signMessage: fromPromise(signMessage),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n },\n actions: {\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 /** @xstate-layout N4IgpgJg5mDOIC5QGUCWUB2AFMAnWA9hgIYA2AsnLMTACJgBuqAxmAILMAuqRAdAPIAHMBjaDB9Jqw7ciAYghEwvVBgYEA1soLDR45J2Kcw5YswAWqsAG0ADAF1EoQQVipZGJyAAeiACwAzADsvACcABwAjKGRtuG2AGyRSX4ANCAAnoiRAEwArLy2uX6RQUGRpeHhfgC+NelomDj4RGSUsNR0jCzsXDwYvADC5mDMGkIiYhLd0n1EAEpwAK6knHJ2jkggLm4eXr4IoRG8eTlFOaWhQX45QaHpWQiRN4UBfu8JeaE3obY5OXUGuhsHhCCQKFQaGBJD0ZP0hiMxhM9NMpL0PItYCs1tZIptnK53P19ogjuETmdcpdrrd7pl-M8wnkgvkgvFbH48n4EkFASBGiCWuD2p1oTN0fCBc0wW1ITAFEoVGpNMo3E1Qa0IR0oRsvDsiUQSU88tVeOEktEEuE8m8cjcHqScicgokTXk8rZygFQgD6vzgdLNSKoTDZh5eFKNcK5WA5HhcARcLxBKQjAAzRMAW14asFMq1ot1W31ey2B0iJr8ZotoStNpu9vpCDtoTNHr8PoizyKvL9kaFsu1XTRcL4-fzwZgmOxw1GGnWDj1hNLoAOFwCBWC5u5RySEQdT1sra+OSt1wCAQuzICfPHQZjoYlY4DUcHounq1nY3WeKXu2JZaIOum5sgkO61tE4QHhWBS2HkCT-G8R5wc8N58hgBAQHAXh3tGQ5iiOcyeMWy4AauiAALQJAeVGFLY9EMYxDG9kC6oDgWIbiqOAzIlMj7cX+BrEeRCCNo8sS2CcRz-B6zIsnBaGsXm974fxREInOvHiGpGLLKsgkrj4iBnrwFwVgkCHfEeCQBNB3K8IEpxBO6ySep8in+mxE4Plx6m4W+UIGWRRlPJEVRmncOTmhyLI2QeUS8GFQRvPBXZRLWt4vuxk4EbCflZd5+EfpwX4aEFhqAU84RRYUpyXmBATJBeQTQZEARhKEG5Ne69GUplXkqaKOmSkszCsB05XCSFOSXgUyVshUdoJLYF7QYkvAXkUER3H45q1qE-XKXhQ2+eGACiuAJrgk1GjN+S8PNUTFMtq1Nrckl-O6wTct6KF5HUdRAA */\n id: \"SignMessageDeviceAction\",\n initial: \"OpenAppDeviceAction\",\n context: ({ input }) => {\n return {\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n signature: null,\n },\n };\n },\n states: {\n OpenAppDeviceAction: {\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"openAppStateMachine\",\n input: { appName: \"Bitcoin\" },\n src: \"openAppStateMachine\",\n onSnapshot: {\n actions: assign({\n intermediateValue: (_) =>\n _.event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n actions: assign({\n _internalState: (_) => {\n return _.event.output.caseOf<SignMessageDAInternalState>({\n Right: () => _.context._internalState,\n Left: (error) => ({\n ..._.context._internalState,\n error,\n }),\n });\n },\n }),\n target: \"CheckOpenAppDeviceActionResult\",\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n {\n target: \"SignMessage\",\n guard: \"noInternalError\",\n },\n \"Error\",\n ],\n },\n SignMessage: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction:\n UserInteractionRequired.SignPersonalMessage,\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"signMessage\",\n src: \"signMessage\",\n input: ({ context }) => ({\n derivationPath: context.input.derivationPath,\n message: context.input.message,\n dataStoreService: context.input.dataStoreService,\n }),\n onDone: {\n target: \"SignMessageResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (isSuccessCommandResult(event.output)) {\n return {\n ...context._internalState,\n signature: event.output.data,\n };\n }\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 SignMessageResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: {\n type: \"final\",\n },\n Error: {\n type: \"final\",\n },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(\"No error in final state\"),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const signMessage = async (arg0: {\n input: {\n derivationPath: string;\n message: string;\n dataStoreService: DataStoreService;\n };\n }) => {\n const {\n input: { derivationPath, message, dataStoreService },\n } = arg0;\n return new SendSignMessageTask(\n internalApi,\n { derivationPath, message },\n dataStoreService,\n ).run();\n };\n\n return {\n signMessage,\n };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["SignMessageDeviceAction_exports", "__export", "SignMessageDeviceAction", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_xstate", "import_SignMessageTask", "internalApi", "signMessage", "context", "_", "input", "error", "event", "arg0", "derivationPath", "message", "dataStoreService"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("@ledgerhq/device-management-kit"),l=require("@ledgerhq/device-management-kit"),u=require("@ledgerhq/device-management-kit"),i=require("../../../app-binder/device-action/__test-utils__/makeInternalApi"),s=require("../../../app-binder/device-action/__test-utils__/setupOpenAppDAMock"),o=require("../../../app-binder/device-action/__test-utils__/testDeviceActionStates"),c=require("./SignMessageDeviceAction");jest.mock("@ledgerhq/device-management-kit",()=>({...jest.requireActual("@ledgerhq/device-management-kit"),OpenAppDeviceAction:jest.fn(()=>({makeStateMachine:jest.fn()}))}));describe("SignMessageDeviceAction",()=>{const n=jest.fn();function d(){return{signMessage:n}}afterEach(()=>{jest.resetAllMocks()}),describe("Success case",()=>{it("should call external dependencies with the correct parameters",r=>{(0,s.setupOpenAppDAMock)();const t=new c.SignMessageDeviceAction({input:{derivationPath:"44'/60'/0'/0/0",message:"Hello world",dataStoreService:"DataStoreService"}});jest.spyOn(t,"extractDependencies").mockReturnValue(d()),n.mockResolvedValueOnce((0,e.CommandResultFactory)({data:{v:28,r:"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788",s:"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513"}}));const a=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignPersonalMessage},status:e.DeviceActionStatus.Pending},{output:{v:28,r:"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788",s:"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513"},status:e.DeviceActionStatus.Completed}],{observable:S}=(0,o.testDeviceActionStates)(t,a,(0,i.makeDeviceActionInternalApiMock)(),r);S.subscribe({complete:()=>{expect(n).toHaveBeenCalledWith(expect.objectContaining({input:{derivationPath:"44'/60'/0'/0/0",message:"Hello world",dataStoreService:"DataStoreService"}}))}})})}),describe("error cases",()=>{it("Error if the open app fails",r=>{(0,s.setupOpenAppDAMock)(new e.UnknownDeviceExchangeError("Mocked error"));const t=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Error,error:new e.UnknownDeviceExchangeError("Mocked error")}],a=new c.SignMessageDeviceAction({input:{derivationPath:"44'/60'/0'/0/0",message:"Hello world",dataStoreService:"DataStoreService"}});(0,o.testDeviceActionStates)(a,t,(0,i.makeDeviceActionInternalApiMock)(),r)}),it("Error if the signPersonalMessage fails",r=>{(0,s.setupOpenAppDAMock)();const t=new c.SignMessageDeviceAction({input:{derivationPath:"44'/60'/0'/0/0",message:"Hello world",dataStoreService:"DataStoreService"}});jest.spyOn(t,"extractDependencies").mockReturnValue(d()),n.mockResolvedValueOnce((0,e.CommandResultFactory)({error:new e.UnknownDeviceExchangeError("Mocked error")}));const a=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignPersonalMessage}},{status:e.DeviceActionStatus.Error,error:new e.UnknownDeviceExchangeError("Mocked error")}];(0,o.testDeviceActionStates)(t,a,(0,i.makeDeviceActionInternalApiMock)(),r)}),it("Error if the signPersonalMessage throws an exception",r=>{(0,s.setupOpenAppDAMock)();const t=new c.SignMessageDeviceAction({input:{derivationPath:"44'/60'/0'/0/0",message:"Hello world",dataStoreService:"DataStoreService"}});jest.spyOn(t,"extractDependencies").mockReturnValue(d()),n.mockRejectedValueOnce(new u.InvalidStatusWordError("Mocked error"));const a=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignPersonalMessage}},{status:e.DeviceActionStatus.Error,error:new u.InvalidStatusWordError("Mocked error")}];(0,o.testDeviceActionStates)(t,a,(0,i.makeDeviceActionInternalApiMock)(),r)}),it("Error if signPersonalMessage return an error",r=>{(0,s.setupOpenAppDAMock)();const t=new c.SignMessageDeviceAction({input:{derivationPath:"44'/60'/0'/0/0",message:"Hello world",dataStoreService:"DataStoreService"}});jest.spyOn(t,"extractDependencies").mockReturnValue(d()),n.mockResolvedValueOnce((0,e.CommandResultFactory)({error:new e.UnknownDeviceExchangeError("Mocked error")}));const a=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignPersonalMessage}},{status:e.DeviceActionStatus.Error,error:new e.UnknownDeviceExchangeError("Mocked error")}];(0,o.testDeviceActionStates)(t,a,(0,i.makeDeviceActionInternalApiMock)(),r)}),it("Return a Left if the final state has no signature",r=>{(0,s.setupOpenAppDAMock)();const t=new c.SignMessageDeviceAction({input:{derivationPath:"44'/60'/0'/0/0",message:"Hello world",dataStoreService:"DataStoreService"}});jest.spyOn(t,"extractDependencies").mockReturnValue(d()),n.mockResolvedValueOnce((0,e.CommandResultFactory)({data:void 0}));const a=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignPersonalMessage}},{status:e.DeviceActionStatus.Error,error:new l.UnknownDAError("No error in final state")}];(0,o.testDeviceActionStates)(t,a,(0,i.makeDeviceActionInternalApiMock)(),r)})})});
2
+ //# sourceMappingURL=SignMessageDeviceAction.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/SignMessage/SignMessageDeviceAction.test.ts"],
4
+ "sourcesContent": ["import {\n CommandResultFactory,\n DeviceActionStatus,\n UnknownDeviceExchangeError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { UnknownDAError } from \"@ledgerhq/device-management-kit\";\nimport { InvalidStatusWordError } from \"@ledgerhq/device-management-kit\";\n\nimport { type SignMessageDAState } from \"@api/index\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupOpenAppDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { type DataStoreService } from \"@internal/data-store/service/DataStoreService\";\n\nimport { SignMessageDeviceAction } from \"./SignMessageDeviceAction\";\n\njest.mock(\n \"@ledgerhq/device-management-kit\",\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n () => ({\n ...jest.requireActual(\"@ledgerhq/device-management-kit\"),\n OpenAppDeviceAction: jest.fn(() => ({\n makeStateMachine: jest.fn(),\n })),\n }),\n);\n\ndescribe(\"SignMessageDeviceAction\", () => {\n const signPersonalMessageMock = jest.fn();\n\n function extractDependenciesMock() {\n return {\n signMessage: signPersonalMessageMock,\n };\n }\n\n afterEach(() => {\n jest.resetAllMocks();\n });\n\n describe(\"Success case\", () => {\n it(\"should call external dependencies with the correct parameters\", (done) => {\n setupOpenAppDAMock();\n\n const deviceAction = new SignMessageDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n message: \"Hello world\",\n dataStoreService: \"DataStoreService\" as unknown as DataStoreService,\n },\n });\n\n // Mock the dependencies to return some sample data\n jest\n .spyOn(deviceAction, \"extractDependencies\")\n .mockReturnValue(extractDependenciesMock());\n signPersonalMessageMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> BuildContext -> ProvideContext -> SignTypedData\n const expectedStates: Array<SignMessageDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction:\n UserInteractionRequired.SignPersonalMessage,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n const { observable } = testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n done,\n );\n\n // @todo Put this in a onDone handle of testDeviceActionStates\n observable.subscribe({\n complete: () => {\n expect(signPersonalMessageMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n message: \"Hello world\",\n dataStoreService: \"DataStoreService\",\n },\n }),\n );\n },\n });\n });\n });\n\n describe(\"error cases\", () => {\n it(\"Error if the open app fails\", (done) => {\n setupOpenAppDAMock(new UnknownDeviceExchangeError(\"Mocked error\"));\n\n const expectedStates: Array<SignMessageDAState> = [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDeviceExchangeError(\"Mocked error\"),\n },\n ];\n\n const deviceAction = new SignMessageDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n message: \"Hello world\",\n dataStoreService: \"DataStoreService\" as unknown as DataStoreService,\n },\n });\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n done,\n );\n });\n\n it(\"Error if the signPersonalMessage fails\", (done) => {\n setupOpenAppDAMock();\n\n const deviceAction = new SignMessageDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n message: \"Hello world\",\n dataStoreService: \"DataStoreService\" as unknown as DataStoreService,\n },\n });\n\n // Mock the dependencies to return some sample data\n jest\n .spyOn(deviceAction, \"extractDependencies\")\n .mockReturnValue(extractDependenciesMock());\n signPersonalMessageMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new UnknownDeviceExchangeError(\"Mocked error\"),\n }),\n );\n\n const expectedStates: Array<SignMessageDAState> = [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction:\n UserInteractionRequired.SignPersonalMessage,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDeviceExchangeError(\"Mocked error\"),\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n done,\n );\n });\n\n it(\"Error if the signPersonalMessage throws an exception\", (done) => {\n setupOpenAppDAMock();\n\n const deviceAction = new SignMessageDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n message: \"Hello world\",\n dataStoreService: \"DataStoreService\" as unknown as DataStoreService,\n },\n });\n\n // Mock the dependencies to return some sample data\n jest\n .spyOn(deviceAction, \"extractDependencies\")\n .mockReturnValue(extractDependenciesMock());\n signPersonalMessageMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"Mocked error\"),\n );\n\n const expectedStates: Array<SignMessageDAState> = [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction:\n UserInteractionRequired.SignPersonalMessage,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new InvalidStatusWordError(\"Mocked error\"),\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n done,\n );\n });\n\n it(\"Error if signPersonalMessage return an error\", (done) => {\n setupOpenAppDAMock();\n\n const deviceAction = new SignMessageDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n message: \"Hello world\",\n dataStoreService: \"DataStoreService\" as unknown as DataStoreService,\n },\n });\n\n // Mock the dependencies to return some sample data\n jest\n .spyOn(deviceAction, \"extractDependencies\")\n .mockReturnValue(extractDependenciesMock());\n signPersonalMessageMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new UnknownDeviceExchangeError(\"Mocked error\"),\n }),\n );\n\n const expectedStates: Array<SignMessageDAState> = [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction:\n UserInteractionRequired.SignPersonalMessage,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDeviceExchangeError(\"Mocked error\"),\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n done,\n );\n });\n\n it(\"Return a Left if the final state has no signature\", (done) => {\n setupOpenAppDAMock();\n\n const deviceAction = new SignMessageDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n message: \"Hello world\",\n dataStoreService: \"DataStoreService\" as unknown as DataStoreService,\n },\n });\n\n // Mock the dependencies to return some sample data\n jest\n .spyOn(deviceAction, \"extractDependencies\")\n .mockReturnValue(extractDependenciesMock());\n signPersonalMessageMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: undefined,\n }),\n );\n\n const expectedStates: Array<SignMessageDAState> = [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction:\n UserInteractionRequired.SignPersonalMessage,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDAError(\"No error in final state\"),\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n done,\n );\n });\n });\n});\n"],
5
+ "mappings": "aAAA,IAAAA,EAKO,2CACPA,EAA+B,2CAC/BA,EAAuC,2CAGvCC,EAAgD,6EAChDC,EAAmC,gFACnCC,EAAuC,oFAGvCC,EAAwC,qCAExC,KAAK,KACH,kCAEA,KAAO,CACL,GAAG,KAAK,cAAc,iCAAiC,EACvD,oBAAqB,KAAK,GAAG,KAAO,CAClC,iBAAkB,KAAK,GAAG,CAC5B,EAAE,CACJ,EACF,EAEA,SAAS,0BAA2B,IAAM,CACxC,MAAMC,EAA0B,KAAK,GAAG,EAExC,SAASC,GAA0B,CACjC,MAAO,CACL,YAAaD,CACf,CACF,CAEA,UAAU,IAAM,CACd,KAAK,cAAc,CACrB,CAAC,EAED,SAAS,eAAgB,IAAM,CAC7B,GAAG,gEAAkEE,GAAS,IAC5E,sBAAmB,EAEnB,MAAMC,EAAe,IAAI,0BAAwB,CAC/C,MAAO,CACL,eAAgB,iBAChB,QAAS,cACT,iBAAkB,kBACpB,CACF,CAAC,EAGD,KACG,MAAMA,EAAc,qBAAqB,EACzC,gBAAgBF,EAAwB,CAAC,EAC5CD,EAAwB,yBACtB,wBAAqB,CACnB,KAAM,CACJ,EAAG,GACH,EAAG,qEACH,EAAG,oEACL,CACF,CAAC,CACH,EAIA,MAAMI,EAA4C,CAChD,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,IACnD,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,cACnD,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBACE,0BAAwB,mBAC5B,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,OAAQ,CACN,EAAG,GACH,EAAG,qEACH,EAAG,oEACL,EACA,OAAQ,qBAAmB,SAC7B,CACF,EAEM,CAAE,WAAAC,CAAW,KAAI,0BACrBF,EACAC,KACA,mCAAgC,EAChCF,CACF,EAGAG,EAAW,UAAU,CACnB,SAAU,IAAM,CACd,OAAOL,CAAuB,EAAE,qBAC9B,OAAO,iBAAiB,CACtB,MAAO,CACL,eAAgB,iBAChB,QAAS,cACT,iBAAkB,kBACpB,CACF,CAAC,CACH,CACF,CACF,CAAC,CACH,CAAC,CACH,CAAC,EAED,SAAS,cAAe,IAAM,CAC5B,GAAG,8BAAgCE,GAAS,IAC1C,sBAAmB,IAAI,6BAA2B,cAAc,CAAC,EAEjE,MAAME,EAA4C,CAChD,CACE,OAAQ,qBAAmB,QAC3B,kBAAmB,CACjB,wBAAyB,0BAAwB,IACnD,CACF,EACA,CACE,OAAQ,qBAAmB,QAC3B,kBAAmB,CACjB,wBAAyB,0BAAwB,cACnD,CACF,EACA,CACE,OAAQ,qBAAmB,MAC3B,MAAO,IAAI,6BAA2B,cAAc,CACtD,CACF,EAEMD,EAAe,IAAI,0BAAwB,CAC/C,MAAO,CACL,eAAgB,iBAChB,QAAS,cACT,iBAAkB,kBACpB,CACF,CAAC,KAED,0BACEA,EACAC,KACA,mCAAgC,EAChCF,CACF,CACF,CAAC,EAED,GAAG,yCAA2CA,GAAS,IACrD,sBAAmB,EAEnB,MAAMC,EAAe,IAAI,0BAAwB,CAC/C,MAAO,CACL,eAAgB,iBAChB,QAAS,cACT,iBAAkB,kBACpB,CACF,CAAC,EAGD,KACG,MAAMA,EAAc,qBAAqB,EACzC,gBAAgBF,EAAwB,CAAC,EAC5CD,EAAwB,yBACtB,wBAAqB,CACnB,MAAO,IAAI,6BAA2B,cAAc,CACtD,CAAC,CACH,EAEA,MAAMI,EAA4C,CAChD,CACE,OAAQ,qBAAmB,QAC3B,kBAAmB,CACjB,wBAAyB,0BAAwB,IACnD,CACF,EACA,CACE,OAAQ,qBAAmB,QAC3B,kBAAmB,CACjB,wBAAyB,0BAAwB,cACnD,CACF,EACA,CACE,OAAQ,qBAAmB,QAC3B,kBAAmB,CACjB,wBACE,0BAAwB,mBAC5B,CACF,EACA,CACE,OAAQ,qBAAmB,MAC3B,MAAO,IAAI,6BAA2B,cAAc,CACtD,CACF,KAEA,0BACED,EACAC,KACA,mCAAgC,EAChCF,CACF,CACF,CAAC,EAED,GAAG,uDAAyDA,GAAS,IACnE,sBAAmB,EAEnB,MAAMC,EAAe,IAAI,0BAAwB,CAC/C,MAAO,CACL,eAAgB,iBAChB,QAAS,cACT,iBAAkB,kBACpB,CACF,CAAC,EAGD,KACG,MAAMA,EAAc,qBAAqB,EACzC,gBAAgBF,EAAwB,CAAC,EAC5CD,EAAwB,sBACtB,IAAI,yBAAuB,cAAc,CAC3C,EAEA,MAAMI,EAA4C,CAChD,CACE,OAAQ,qBAAmB,QAC3B,kBAAmB,CACjB,wBAAyB,0BAAwB,IACnD,CACF,EACA,CACE,OAAQ,qBAAmB,QAC3B,kBAAmB,CACjB,wBAAyB,0BAAwB,cACnD,CACF,EACA,CACE,OAAQ,qBAAmB,QAC3B,kBAAmB,CACjB,wBACE,0BAAwB,mBAC5B,CACF,EACA,CACE,OAAQ,qBAAmB,MAC3B,MAAO,IAAI,yBAAuB,cAAc,CAClD,CACF,KAEA,0BACED,EACAC,KACA,mCAAgC,EAChCF,CACF,CACF,CAAC,EAED,GAAG,+CAAiDA,GAAS,IAC3D,sBAAmB,EAEnB,MAAMC,EAAe,IAAI,0BAAwB,CAC/C,MAAO,CACL,eAAgB,iBAChB,QAAS,cACT,iBAAkB,kBACpB,CACF,CAAC,EAGD,KACG,MAAMA,EAAc,qBAAqB,EACzC,gBAAgBF,EAAwB,CAAC,EAC5CD,EAAwB,yBACtB,wBAAqB,CACnB,MAAO,IAAI,6BAA2B,cAAc,CACtD,CAAC,CACH,EAEA,MAAMI,EAA4C,CAChD,CACE,OAAQ,qBAAmB,QAC3B,kBAAmB,CACjB,wBAAyB,0BAAwB,IACnD,CACF,EACA,CACE,OAAQ,qBAAmB,QAC3B,kBAAmB,CACjB,wBAAyB,0BAAwB,cACnD,CACF,EACA,CACE,OAAQ,qBAAmB,QAC3B,kBAAmB,CACjB,wBACE,0BAAwB,mBAC5B,CACF,EACA,CACE,OAAQ,qBAAmB,MAC3B,MAAO,IAAI,6BAA2B,cAAc,CACtD,CACF,KAEA,0BACED,EACAC,KACA,mCAAgC,EAChCF,CACF,CACF,CAAC,EAED,GAAG,oDAAsDA,GAAS,IAChE,sBAAmB,EAEnB,MAAMC,EAAe,IAAI,0BAAwB,CAC/C,MAAO,CACL,eAAgB,iBAChB,QAAS,cACT,iBAAkB,kBACpB,CACF,CAAC,EAGD,KACG,MAAMA,EAAc,qBAAqB,EACzC,gBAAgBF,EAAwB,CAAC,EAC5CD,EAAwB,yBACtB,wBAAqB,CACnB,KAAM,MACR,CAAC,CACH,EAEA,MAAMI,EAA4C,CAChD,CACE,OAAQ,qBAAmB,QAC3B,kBAAmB,CACjB,wBAAyB,0BAAwB,IACnD,CACF,EACA,CACE,OAAQ,qBAAmB,QAC3B,kBAAmB,CACjB,wBAAyB,0BAAwB,cACnD,CACF,EACA,CACE,OAAQ,qBAAmB,QAC3B,kBAAmB,CACjB,wBACE,0BAAwB,mBAC5B,CACF,EACA,CACE,OAAQ,qBAAmB,MAC3B,MAAO,IAAI,iBAAe,yBAAyB,CACrD,CACF,KAEA,0BACED,EACAC,KACA,mCAAgC,EAChCF,CACF,CACF,CAAC,CACH,CAAC,CACH,CAAC",
6
+ "names": ["import_device_management_kit", "import_makeInternalApi", "import_setupOpenAppDAMock", "import_testDeviceActionStates", "import_SignMessageDeviceAction", "signPersonalMessageMock", "extractDependenciesMock", "done", "deviceAction", "expectedStates", "observable"]
7
+ }
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("@ledgerhq/device-management-kit"),P=require("@ledgerhq/device-management-kit"),m=require("@ledgerhq/device-management-kit"),o=require("../../../app-binder/device-action/__test-utils__/makeInternalApi"),l=require("../../../app-binder/device-action/__test-utils__/setupOpenAppDAMock"),d=require("../../../app-binder/device-action/__test-utils__/testDeviceActionStates"),u=require("./SignPsbtDeviceAction");vi.mock("@ledgerhq/device-management-kit",async s=>({...await s(),OpenAppDeviceAction:vi.fn(()=>({makeStateMachine:vi.fn()}))}));describe("SignPsbtDeviceAction",()=>{const s=vi.fn(),i=vi.fn(),c=vi.fn();function p(){return{signPsbt:s,prepareWalletPolicy:i,buildPsbt:c}}describe("Success case",()=>{it("should call external dependencies with the correct parameters",()=>new Promise((r,a)=>{(0,l.setupOpenAppDAMock)();const t=new u.SignPsbtDeviceAction({input:{wallet:"ApiWallet",psbt:"Hello world",walletBuilder:"WalletBuilder",walletSerializer:"WalletSerializer",dataStoreService:"DataStoreService",psbtMapper:"PsbtMapper",valueParser:"ValueParser"}});vi.spyOn(t,"extractDependencies").mockReturnValue(p()),i.mockResolvedValueOnce((0,e.CommandResultFactory)({data:"Wallet"})),c.mockResolvedValueOnce((0,e.CommandResultFactory)({data:"BuildPsbtResult"})),s.mockResolvedValueOnce((0,e.CommandResultFactory)({data:[{inputIndex:0,pubkey:Uint8Array.from([4,5,6]),signature:Uint8Array.from([1,2,3])}]}));const n=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction},status:e.DeviceActionStatus.Pending},{output:[{inputIndex:0,pubkey:Uint8Array.from([4,5,6]),signature:Uint8Array.from([1,2,3])}],status:e.DeviceActionStatus.Completed}];(0,d.testDeviceActionStates)(t,n,(0,o.makeDeviceActionInternalApiMock)(),{onDone:()=>{expect(i).toHaveBeenCalledWith(expect.objectContaining({input:{wallet:"ApiWallet",walletBuilder:"WalletBuilder"}})),expect(c).toHaveBeenCalledWith(expect.objectContaining({input:{psbt:"Hello world",wallet:"Wallet",dataStoreService:"DataStoreService",psbtMapper:"PsbtMapper"}})),expect(s).toHaveBeenCalledWith(expect.objectContaining({input:{wallet:"Wallet",buildPsbtResult:"BuildPsbtResult",walletSerializer:"WalletSerializer",valueParser:"ValueParser"}})),r()},onError:a})}))}),describe("error cases",()=>{beforeEach(()=>{vi.resetAllMocks()}),it("Error if open app fails",()=>new Promise((r,a)=>{(0,l.setupOpenAppDAMock)(new e.UnknownDeviceExchangeError("Mocked error"));const t=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Error,error:new e.UnknownDeviceExchangeError("Mocked error")}],n=new u.SignPsbtDeviceAction({input:{wallet:{},psbt:"Hello world",walletBuilder:{},walletSerializer:{},dataStoreService:{},psbtMapper:{},valueParser:{}}});(0,d.testDeviceActionStates)(n,t,(0,o.makeDeviceActionInternalApiMock)(),{onDone:r,onError:a})})),it("Error if prepareWallet fails",()=>new Promise((r,a)=>{(0,l.setupOpenAppDAMock)();const t=new u.SignPsbtDeviceAction({input:{wallet:{},psbt:"Hello world",walletBuilder:{},walletSerializer:{},dataStoreService:{},psbtMapper:{},valueParser:{}}});vi.spyOn(t,"extractDependencies").mockReturnValue(p()),i.mockResolvedValueOnce((0,e.CommandResultFactory)({error:new e.UnknownDeviceExchangeError("Mocked error")}));const n=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Error,error:new e.UnknownDeviceExchangeError("Mocked error")}];(0,d.testDeviceActionStates)(t,n,(0,o.makeDeviceActionInternalApiMock)(),{onDone:r,onError:a})})),it("Error if buildPsbt fails",()=>new Promise((r,a)=>{(0,l.setupOpenAppDAMock)();const t=new u.SignPsbtDeviceAction({input:{wallet:{},psbt:"Hello world",walletBuilder:{},walletSerializer:{},dataStoreService:{},psbtMapper:{},valueParser:{}}});vi.spyOn(t,"extractDependencies").mockReturnValue(p()),i.mockResolvedValueOnce((0,e.CommandResultFactory)({data:{}})),c.mockResolvedValueOnce((0,e.CommandResultFactory)({error:new e.UnknownDeviceExchangeError("Mocked error")}));const n=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Error,error:new e.UnknownDeviceExchangeError("Mocked error")}];(0,d.testDeviceActionStates)(t,n,(0,o.makeDeviceActionInternalApiMock)(),{onDone:r,onError:a})})),it("Error if signPsbt fails",()=>new Promise((r,a)=>{(0,l.setupOpenAppDAMock)();const t=new u.SignPsbtDeviceAction({input:{wallet:{},psbt:"Hello world",walletBuilder:{},walletSerializer:{},dataStoreService:{},psbtMapper:{},valueParser:{}}});vi.spyOn(t,"extractDependencies").mockReturnValue(p()),i.mockResolvedValueOnce((0,e.CommandResultFactory)({data:{}})),c.mockResolvedValueOnce((0,e.CommandResultFactory)({data:{}})),s.mockResolvedValueOnce((0,e.CommandResultFactory)({error:new e.UnknownDeviceExchangeError("Mocked error")}));const n=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction}},{status:e.DeviceActionStatus.Error,error:new e.UnknownDeviceExchangeError("Mocked error")}];(0,d.testDeviceActionStates)(t,n,(0,o.makeDeviceActionInternalApiMock)(),{onDone:r,onError:a})})),it("Error if signPsbt throws an exception",()=>new Promise((r,a)=>{(0,l.setupOpenAppDAMock)();const t=new u.SignPsbtDeviceAction({input:{wallet:{},psbt:"Hello world",walletBuilder:{},walletSerializer:{},dataStoreService:{},psbtMapper:{},valueParser:{}}});vi.spyOn(t,"extractDependencies").mockReturnValue(p()),i.mockResolvedValueOnce((0,e.CommandResultFactory)({data:{}})),c.mockResolvedValueOnce((0,e.CommandResultFactory)({data:{}})),s.mockRejectedValueOnce(new m.InvalidStatusWordError("Mocked error"));const n=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction}},{status:e.DeviceActionStatus.Error,error:new m.InvalidStatusWordError("Mocked error")}];(0,d.testDeviceActionStates)(t,n,(0,o.makeDeviceActionInternalApiMock)(),{onDone:r,onError:a})})),it("Return a Left if the final state has no signature",()=>new Promise((r,a)=>{(0,l.setupOpenAppDAMock)();const t=new u.SignPsbtDeviceAction({input:{wallet:{},psbt:"Hello world",walletBuilder:{},walletSerializer:{},dataStoreService:{},psbtMapper:{},valueParser:{}}});vi.spyOn(t,"extractDependencies").mockReturnValue(p()),i.mockResolvedValueOnce((0,e.CommandResultFactory)({data:{}})),c.mockResolvedValueOnce((0,e.CommandResultFactory)({data:{}})),s.mockResolvedValueOnce((0,e.CommandResultFactory)({data:void 0}));const n=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction}},{status:e.DeviceActionStatus.Error,error:new P.UnknownDAError("No error in final state")}];(0,d.testDeviceActionStates)(t,n,(0,o.makeDeviceActionInternalApiMock)(),{onDone:r,onError:a})}))})});
1
+ "use strict";var e=require("@ledgerhq/device-management-kit"),m=require("@ledgerhq/device-management-kit"),p=require("@ledgerhq/device-management-kit"),i=require("../../../app-binder/device-action/__test-utils__/makeInternalApi"),s=require("../../../app-binder/device-action/__test-utils__/setupOpenAppDAMock"),l=require("../../../app-binder/device-action/__test-utils__/testDeviceActionStates"),o=require("./SignPsbtDeviceAction");jest.mock("@ledgerhq/device-management-kit",()=>({...jest.requireActual("@ledgerhq/device-management-kit"),OpenAppDeviceAction:jest.fn(()=>({makeStateMachine:jest.fn()}))}));describe("SignPsbtDeviceAction",()=>{const d=jest.fn(),n=jest.fn(),u=jest.fn();function c(){return{signPsbt:d,prepareWalletPolicy:n,buildPsbt:u}}describe("Success case",()=>{it("should call external dependencies with the correct parameters",r=>{(0,s.setupOpenAppDAMock)();const t=new o.SignPsbtDeviceAction({input:{wallet:"ApiWallet",psbt:"Hello world",walletBuilder:"WalletBuilder",walletSerializer:"WalletSerializer",dataStoreService:"DataStoreService",psbtMapper:"PsbtMapper",valueParser:"ValueParser"}});jest.spyOn(t,"extractDependencies").mockReturnValue(c()),n.mockResolvedValueOnce((0,e.CommandResultFactory)({data:"Wallet"})),u.mockResolvedValueOnce((0,e.CommandResultFactory)({data:"BuildPsbtResult"})),d.mockResolvedValueOnce((0,e.CommandResultFactory)({data:[{inputIndex:0,pubkey:Uint8Array.from([4,5,6]),signature:Uint8Array.from([1,2,3])}]}));const a=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction},status:e.DeviceActionStatus.Pending},{output:[{inputIndex:0,pubkey:Uint8Array.from([4,5,6]),signature:Uint8Array.from([1,2,3])}],status:e.DeviceActionStatus.Completed}],{observable:S}=(0,l.testDeviceActionStates)(t,a,(0,i.makeDeviceActionInternalApiMock)(),r);S.subscribe({complete:()=>{expect(n).toHaveBeenCalledWith(expect.objectContaining({input:{wallet:"ApiWallet",walletBuilder:"WalletBuilder"}})),expect(u).toHaveBeenCalledWith(expect.objectContaining({input:{psbt:"Hello world",wallet:"Wallet",dataStoreService:"DataStoreService",psbtMapper:"PsbtMapper"}})),expect(d).toHaveBeenCalledWith(expect.objectContaining({input:{wallet:"Wallet",buildPsbtResult:"BuildPsbtResult",walletSerializer:"WalletSerializer",valueParser:"ValueParser"}}))}})})}),describe("error cases",()=>{beforeEach(()=>{jest.resetAllMocks()}),it("Error if open app fails",r=>{(0,s.setupOpenAppDAMock)(new e.UnknownDeviceExchangeError("Mocked error"));const t=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Error,error:new e.UnknownDeviceExchangeError("Mocked error")}],a=new o.SignPsbtDeviceAction({input:{wallet:{},psbt:"Hello world",walletBuilder:{},walletSerializer:{},dataStoreService:{},psbtMapper:{},valueParser:{}}});(0,l.testDeviceActionStates)(a,t,(0,i.makeDeviceActionInternalApiMock)(),r)}),it("Error if prepareWallet fails",r=>{(0,s.setupOpenAppDAMock)();const t=new o.SignPsbtDeviceAction({input:{wallet:{},psbt:"Hello world",walletBuilder:{},walletSerializer:{},dataStoreService:{},psbtMapper:{},valueParser:{}}});jest.spyOn(t,"extractDependencies").mockReturnValue(c()),n.mockResolvedValueOnce((0,e.CommandResultFactory)({error:new e.UnknownDeviceExchangeError("Mocked error")}));const a=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Error,error:new e.UnknownDeviceExchangeError("Mocked error")}];(0,l.testDeviceActionStates)(t,a,(0,i.makeDeviceActionInternalApiMock)(),r)}),it("Error if buildPsbt fails",r=>{(0,s.setupOpenAppDAMock)();const t=new o.SignPsbtDeviceAction({input:{wallet:{},psbt:"Hello world",walletBuilder:{},walletSerializer:{},dataStoreService:{},psbtMapper:{},valueParser:{}}});jest.spyOn(t,"extractDependencies").mockReturnValue(c()),n.mockResolvedValueOnce((0,e.CommandResultFactory)({data:{}})),u.mockResolvedValueOnce((0,e.CommandResultFactory)({error:new e.UnknownDeviceExchangeError("Mocked error")}));const a=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Error,error:new e.UnknownDeviceExchangeError("Mocked error")}];(0,l.testDeviceActionStates)(t,a,(0,i.makeDeviceActionInternalApiMock)(),r)}),it("Error if signPsbt fails",r=>{(0,s.setupOpenAppDAMock)();const t=new o.SignPsbtDeviceAction({input:{wallet:{},psbt:"Hello world",walletBuilder:{},walletSerializer:{},dataStoreService:{},psbtMapper:{},valueParser:{}}});jest.spyOn(t,"extractDependencies").mockReturnValue(c()),n.mockResolvedValueOnce((0,e.CommandResultFactory)({data:{}})),u.mockResolvedValueOnce((0,e.CommandResultFactory)({data:{}})),d.mockResolvedValueOnce((0,e.CommandResultFactory)({error:new e.UnknownDeviceExchangeError("Mocked error")}));const a=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction}},{status:e.DeviceActionStatus.Error,error:new e.UnknownDeviceExchangeError("Mocked error")}];(0,l.testDeviceActionStates)(t,a,(0,i.makeDeviceActionInternalApiMock)(),r)}),it("Error if signPsbt throws an exception",r=>{(0,s.setupOpenAppDAMock)();const t=new o.SignPsbtDeviceAction({input:{wallet:{},psbt:"Hello world",walletBuilder:{},walletSerializer:{},dataStoreService:{},psbtMapper:{},valueParser:{}}});jest.spyOn(t,"extractDependencies").mockReturnValue(c()),n.mockResolvedValueOnce((0,e.CommandResultFactory)({data:{}})),u.mockResolvedValueOnce((0,e.CommandResultFactory)({data:{}})),d.mockRejectedValueOnce(new p.InvalidStatusWordError("Mocked error"));const a=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction}},{status:e.DeviceActionStatus.Error,error:new p.InvalidStatusWordError("Mocked error")}];(0,l.testDeviceActionStates)(t,a,(0,i.makeDeviceActionInternalApiMock)(),r)}),it("Return a Left if the final state has no signature",r=>{(0,s.setupOpenAppDAMock)();const t=new o.SignPsbtDeviceAction({input:{wallet:{},psbt:"Hello world",walletBuilder:{},walletSerializer:{},dataStoreService:{},psbtMapper:{},valueParser:{}}});jest.spyOn(t,"extractDependencies").mockReturnValue(c()),n.mockResolvedValueOnce((0,e.CommandResultFactory)({data:{}})),u.mockResolvedValueOnce((0,e.CommandResultFactory)({data:{}})),d.mockResolvedValueOnce((0,e.CommandResultFactory)({data:void 0}));const a=[{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}},{status:e.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction}},{status:e.DeviceActionStatus.Error,error:new m.UnknownDAError("No error in final state")}];(0,l.testDeviceActionStates)(t,a,(0,i.makeDeviceActionInternalApiMock)(),r)})})});
2
2
  //# sourceMappingURL=SignPsbtDeviceAction.test.js.map