@ledgerhq/device-management-kit 0.0.0-rnble-transport-20250226091520 → 0.0.0-rnble-transport-20250307123452

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 (244) hide show
  1. package/lib/cjs/package.json +2 -2
  2. package/lib/cjs/src/api/DeviceManagementKit.js +1 -1
  3. package/lib/cjs/src/api/DeviceManagementKit.js.map +2 -2
  4. package/lib/cjs/src/api/DeviceManagementKit.test.js +1 -1
  5. package/lib/cjs/src/api/DeviceManagementKit.test.js.map +2 -2
  6. package/lib/cjs/src/api/command/os/GetOsVersionCommand.js +1 -1
  7. package/lib/cjs/src/api/command/os/GetOsVersionCommand.js.map +3 -3
  8. package/lib/cjs/src/api/command/os/SecureElementFlagsParser.js +2 -0
  9. package/lib/cjs/src/api/command/os/SecureElementFlagsParser.js.map +7 -0
  10. package/lib/cjs/src/api/command/os/SecureElementFlagsParser.test.js +2 -0
  11. package/lib/cjs/src/api/command/os/SecureElementFlagsParser.test.js.map +7 -0
  12. package/lib/cjs/src/api/command/os/__mocks__/GetOsVersionCommand.js +1 -1
  13. package/lib/cjs/src/api/command/os/__mocks__/GetOsVersionCommand.js.map +2 -2
  14. package/lib/cjs/src/api/device/SecureElementFlags.js +2 -0
  15. package/lib/cjs/src/api/device/SecureElementFlags.js.map +7 -0
  16. package/lib/cjs/src/api/device-action/DeviceAction.js +1 -1
  17. package/lib/cjs/src/api/device-action/DeviceAction.js.map +1 -1
  18. package/lib/cjs/src/api/device-action/__test-utils__/makeInternalApi.js +1 -1
  19. package/lib/cjs/src/api/device-action/__test-utils__/makeInternalApi.js.map +3 -3
  20. package/lib/cjs/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.test.js +1 -1
  21. package/lib/cjs/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.test.js.map +2 -2
  22. package/lib/cjs/src/api/device-action/os/GoToDashboard/GoToDashboardDeviceAction.test.js +1 -1
  23. package/lib/cjs/src/api/device-action/os/GoToDashboard/GoToDashboardDeviceAction.test.js.map +2 -2
  24. package/lib/cjs/src/api/device-action/os/ListAppsWithMetadata/ListAppsWithMetadataDeviceAction.js +1 -1
  25. package/lib/cjs/src/api/device-action/os/ListAppsWithMetadata/ListAppsWithMetadataDeviceAction.js.map +3 -3
  26. package/lib/cjs/src/api/device-action/os/ListAppsWithMetadata/ListAppsWithMetadataDeviceAction.test.js +1 -1
  27. package/lib/cjs/src/api/device-action/os/ListAppsWithMetadata/ListAppsWithMetadataDeviceAction.test.js.map +3 -3
  28. package/lib/cjs/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.test.js +1 -1
  29. package/lib/cjs/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.test.js.map +2 -2
  30. package/lib/cjs/src/api/device-session/DeviceSessionState.js +1 -1
  31. package/lib/cjs/src/api/device-session/DeviceSessionState.js.map +1 -1
  32. package/lib/cjs/src/api/device-session/use-case/DisableDeviceSessionRefresher.js +2 -0
  33. package/lib/cjs/src/api/device-session/use-case/DisableDeviceSessionRefresher.js.map +7 -0
  34. package/lib/cjs/src/api/device-session/use-case/DisableDeviceSessionRefresher.test.js +2 -0
  35. package/lib/cjs/src/api/device-session/use-case/DisableDeviceSessionRefresher.test.js.map +7 -0
  36. package/lib/cjs/src/api/index.js +1 -1
  37. package/lib/cjs/src/api/index.js.map +3 -3
  38. package/lib/cjs/src/api/secure-channel/constants.js +2 -0
  39. package/lib/cjs/src/api/secure-channel/constants.js.map +7 -0
  40. package/lib/cjs/src/api/secure-channel/device-action/GenuineCheck/GenuineCheckDeviceAction.js +2 -0
  41. package/lib/cjs/src/api/secure-channel/device-action/GenuineCheck/GenuineCheckDeviceAction.js.map +7 -0
  42. package/lib/cjs/src/api/secure-channel/device-action/GenuineCheck/GenuineCheckDeviceAction.test.js +2 -0
  43. package/lib/cjs/src/api/secure-channel/device-action/GenuineCheck/GenuineCheckDeviceAction.test.js.map +7 -0
  44. package/lib/cjs/src/api/secure-channel/device-action/GenuineCheck/types.js +2 -0
  45. package/lib/cjs/src/api/secure-channel/device-action/GenuineCheck/types.js.map +7 -0
  46. package/lib/cjs/src/api/secure-channel/task/ConnectToSecureChannelTask.js +2 -0
  47. package/lib/cjs/src/api/secure-channel/task/ConnectToSecureChannelTask.js.map +7 -0
  48. package/lib/cjs/src/api/secure-channel/task/ConnectToSecureChannelTask.test.js +2 -0
  49. package/lib/cjs/src/api/secure-channel/task/ConnectToSecureChannelTask.test.js.map +7 -0
  50. package/lib/cjs/src/api/secure-channel/task/types.js +2 -0
  51. package/lib/cjs/src/api/secure-channel/task/types.js.map +7 -0
  52. package/lib/cjs/src/api/secure-channel/utils.js +2 -0
  53. package/lib/cjs/src/api/secure-channel/utils.js.map +7 -0
  54. package/lib/cjs/src/api/secure-channel/utils.test.js +2 -0
  55. package/lib/cjs/src/api/secure-channel/utils.test.js.map +7 -0
  56. package/lib/cjs/src/api/transport/model/DeviceConnectionStateMachine.js +1 -1
  57. package/lib/cjs/src/api/transport/model/DeviceConnectionStateMachine.js.map +3 -3
  58. package/lib/cjs/src/api/transport/model/Errors.js.map +2 -2
  59. package/lib/cjs/src/api/types.js +1 -1
  60. package/lib/cjs/src/api/types.js.map +1 -1
  61. package/lib/cjs/src/internal/device-session/di/deviceSessionModule.js +1 -1
  62. package/lib/cjs/src/internal/device-session/di/deviceSessionModule.js.map +3 -3
  63. package/lib/cjs/src/internal/device-session/di/deviceSessionTypes.js +1 -1
  64. package/lib/cjs/src/internal/device-session/di/deviceSessionTypes.js.map +2 -2
  65. package/lib/cjs/src/internal/device-session/model/DeviceSession.js +1 -1
  66. package/lib/cjs/src/internal/device-session/model/DeviceSession.js.map +3 -3
  67. package/lib/cjs/src/internal/device-session/model/DeviceSessionRefresher.js +1 -1
  68. package/lib/cjs/src/internal/device-session/model/DeviceSessionRefresher.js.map +2 -2
  69. package/lib/cjs/src/internal/device-session/service/DefaultApduSenderService.js +1 -1
  70. package/lib/cjs/src/internal/device-session/service/DefaultApduSenderService.js.map +2 -2
  71. package/lib/cjs/src/internal/device-session/service/RefresherService.js +2 -0
  72. package/lib/cjs/src/internal/device-session/service/RefresherService.js.map +7 -0
  73. package/lib/cjs/src/internal/device-session/service/RefresherService.test.js +2 -0
  74. package/lib/cjs/src/internal/device-session/service/RefresherService.test.js.map +7 -0
  75. package/lib/cjs/src/internal/discovery/use-case/ListenToAvailableDevicesUseCase.js +1 -1
  76. package/lib/cjs/src/internal/discovery/use-case/ListenToAvailableDevicesUseCase.js.map +3 -3
  77. package/lib/cjs/src/internal/discovery/use-case/ListenToAvailableDevicesUseCase.test.js +1 -1
  78. package/lib/cjs/src/internal/discovery/use-case/ListenToAvailableDevicesUseCase.test.js.map +3 -3
  79. package/lib/cjs/src/internal/secure-channel/data/DefaultSecureChannelDataSource.js +1 -1
  80. package/lib/cjs/src/internal/secure-channel/data/DefaultSecureChannelDataSource.js.map +2 -2
  81. package/lib/cjs/src/internal/secure-channel/data/SecureChannelDataSource.js.map +1 -1
  82. package/lib/cjs/src/internal/secure-channel/model/Errors.js +1 -1
  83. package/lib/cjs/src/internal/secure-channel/model/Errors.js.map +3 -3
  84. package/lib/cjs/src/internal/secure-channel/service/DefaultSecureChannelService.js +1 -1
  85. package/lib/cjs/src/internal/secure-channel/service/DefaultSecureChannelService.js.map +3 -3
  86. package/lib/cjs/src/internal/secure-channel/service/SecureChannelService.js.map +1 -1
  87. package/lib/esm/package.json +2 -2
  88. package/lib/esm/src/api/DeviceManagementKit.js +1 -1
  89. package/lib/esm/src/api/DeviceManagementKit.js.map +2 -2
  90. package/lib/esm/src/api/DeviceManagementKit.test.js +1 -1
  91. package/lib/esm/src/api/DeviceManagementKit.test.js.map +2 -2
  92. package/lib/esm/src/api/command/os/GetOsVersionCommand.js +1 -1
  93. package/lib/esm/src/api/command/os/GetOsVersionCommand.js.map +3 -3
  94. package/lib/esm/src/api/command/os/SecureElementFlagsParser.js +2 -0
  95. package/lib/esm/src/api/command/os/SecureElementFlagsParser.js.map +7 -0
  96. package/lib/esm/src/api/command/os/SecureElementFlagsParser.test.js +2 -0
  97. package/lib/esm/src/api/command/os/SecureElementFlagsParser.test.js.map +7 -0
  98. package/lib/esm/src/api/command/os/__mocks__/GetOsVersionCommand.js +1 -1
  99. package/lib/esm/src/api/command/os/__mocks__/GetOsVersionCommand.js.map +2 -2
  100. package/lib/esm/src/api/device/SecureElementFlags.js +1 -0
  101. package/lib/esm/src/api/device/SecureElementFlags.js.map +7 -0
  102. package/lib/esm/src/api/device-action/__test-utils__/makeInternalApi.js +1 -1
  103. package/lib/esm/src/api/device-action/__test-utils__/makeInternalApi.js.map +3 -3
  104. package/lib/esm/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.test.js +1 -1
  105. package/lib/esm/src/api/device-action/os/GetDeviceStatus/GetDeviceStatusDeviceAction.test.js.map +2 -2
  106. package/lib/esm/src/api/device-action/os/GoToDashboard/GoToDashboardDeviceAction.test.js +1 -1
  107. package/lib/esm/src/api/device-action/os/GoToDashboard/GoToDashboardDeviceAction.test.js.map +2 -2
  108. package/lib/esm/src/api/device-action/os/ListAppsWithMetadata/ListAppsWithMetadataDeviceAction.js +1 -1
  109. package/lib/esm/src/api/device-action/os/ListAppsWithMetadata/ListAppsWithMetadataDeviceAction.js.map +3 -3
  110. package/lib/esm/src/api/device-action/os/ListAppsWithMetadata/ListAppsWithMetadataDeviceAction.test.js +1 -1
  111. package/lib/esm/src/api/device-action/os/ListAppsWithMetadata/ListAppsWithMetadataDeviceAction.test.js.map +3 -3
  112. package/lib/esm/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.test.js +1 -1
  113. package/lib/esm/src/api/device-action/os/OpenAppDeviceAction/OpenAppDeviceAction.test.js.map +2 -2
  114. package/lib/esm/src/api/device-session/DeviceSessionState.js.map +1 -1
  115. package/lib/esm/src/api/device-session/use-case/DisableDeviceSessionRefresher.js +2 -0
  116. package/lib/esm/src/api/device-session/use-case/DisableDeviceSessionRefresher.js.map +7 -0
  117. package/lib/esm/src/api/device-session/use-case/DisableDeviceSessionRefresher.test.js +2 -0
  118. package/lib/esm/src/api/device-session/use-case/DisableDeviceSessionRefresher.test.js.map +7 -0
  119. package/lib/esm/src/api/index.js +1 -1
  120. package/lib/esm/src/api/index.js.map +3 -3
  121. package/lib/esm/src/api/secure-channel/constants.js +2 -0
  122. package/lib/esm/src/api/secure-channel/constants.js.map +7 -0
  123. package/lib/esm/src/api/secure-channel/device-action/GenuineCheck/GenuineCheckDeviceAction.js +2 -0
  124. package/lib/esm/src/api/secure-channel/device-action/GenuineCheck/GenuineCheckDeviceAction.js.map +7 -0
  125. package/lib/esm/src/api/secure-channel/device-action/GenuineCheck/GenuineCheckDeviceAction.test.js +2 -0
  126. package/lib/esm/src/api/secure-channel/device-action/GenuineCheck/GenuineCheckDeviceAction.test.js.map +7 -0
  127. package/lib/esm/src/api/secure-channel/device-action/GenuineCheck/types.js +1 -0
  128. package/lib/esm/src/api/secure-channel/device-action/GenuineCheck/types.js.map +7 -0
  129. package/lib/esm/src/api/secure-channel/task/ConnectToSecureChannelTask.js +2 -0
  130. package/lib/esm/src/api/secure-channel/task/ConnectToSecureChannelTask.js.map +7 -0
  131. package/lib/esm/src/api/secure-channel/task/ConnectToSecureChannelTask.test.js +2 -0
  132. package/lib/esm/src/api/secure-channel/task/ConnectToSecureChannelTask.test.js.map +7 -0
  133. package/lib/esm/src/api/secure-channel/task/types.js +2 -0
  134. package/lib/esm/src/api/secure-channel/task/types.js.map +7 -0
  135. package/lib/esm/src/api/secure-channel/utils.js +2 -0
  136. package/lib/esm/src/api/secure-channel/utils.js.map +7 -0
  137. package/lib/esm/src/api/secure-channel/utils.test.js +2 -0
  138. package/lib/esm/src/api/secure-channel/utils.test.js.map +7 -0
  139. package/lib/esm/src/api/transport/model/DeviceConnectionStateMachine.js +1 -1
  140. package/lib/esm/src/api/transport/model/DeviceConnectionStateMachine.js.map +3 -3
  141. package/lib/esm/src/api/transport/model/Errors.js.map +2 -2
  142. package/lib/esm/src/internal/device-session/di/deviceSessionModule.js +1 -1
  143. package/lib/esm/src/internal/device-session/di/deviceSessionModule.js.map +3 -3
  144. package/lib/esm/src/internal/device-session/di/deviceSessionTypes.js +1 -1
  145. package/lib/esm/src/internal/device-session/di/deviceSessionTypes.js.map +2 -2
  146. package/lib/esm/src/internal/device-session/model/DeviceSession.js +1 -1
  147. package/lib/esm/src/internal/device-session/model/DeviceSession.js.map +3 -3
  148. package/lib/esm/src/internal/device-session/model/DeviceSessionRefresher.js +1 -1
  149. package/lib/esm/src/internal/device-session/model/DeviceSessionRefresher.js.map +2 -2
  150. package/lib/esm/src/internal/device-session/service/DefaultApduSenderService.js +1 -1
  151. package/lib/esm/src/internal/device-session/service/DefaultApduSenderService.js.map +2 -2
  152. package/lib/esm/src/internal/device-session/service/RefresherService.js +2 -0
  153. package/lib/esm/src/internal/device-session/service/RefresherService.js.map +7 -0
  154. package/lib/esm/src/internal/device-session/service/RefresherService.test.js +2 -0
  155. package/lib/esm/src/internal/device-session/service/RefresherService.test.js.map +7 -0
  156. package/lib/esm/src/internal/discovery/use-case/ListenToAvailableDevicesUseCase.js +1 -1
  157. package/lib/esm/src/internal/discovery/use-case/ListenToAvailableDevicesUseCase.js.map +3 -3
  158. package/lib/esm/src/internal/discovery/use-case/ListenToAvailableDevicesUseCase.test.js +1 -1
  159. package/lib/esm/src/internal/discovery/use-case/ListenToAvailableDevicesUseCase.test.js.map +3 -3
  160. package/lib/esm/src/internal/secure-channel/data/DefaultSecureChannelDataSource.js +1 -1
  161. package/lib/esm/src/internal/secure-channel/data/DefaultSecureChannelDataSource.js.map +2 -2
  162. package/lib/esm/src/internal/secure-channel/model/Errors.js +1 -1
  163. package/lib/esm/src/internal/secure-channel/model/Errors.js.map +3 -3
  164. package/lib/esm/src/internal/secure-channel/service/DefaultSecureChannelService.js +1 -1
  165. package/lib/esm/src/internal/secure-channel/service/DefaultSecureChannelService.js.map +3 -3
  166. package/lib/types/src/api/DeviceManagementKit.d.ts +10 -8
  167. package/lib/types/src/api/DeviceManagementKit.d.ts.map +1 -1
  168. package/lib/types/src/api/command/os/GetOsVersionCommand.d.ts +8 -2
  169. package/lib/types/src/api/command/os/GetOsVersionCommand.d.ts.map +1 -1
  170. package/lib/types/src/api/command/os/SecureElementFlagsParser.d.ts +43 -0
  171. package/lib/types/src/api/command/os/SecureElementFlagsParser.d.ts.map +1 -0
  172. package/lib/types/src/api/command/os/SecureElementFlagsParser.test.d.ts +2 -0
  173. package/lib/types/src/api/command/os/SecureElementFlagsParser.test.d.ts.map +1 -0
  174. package/lib/types/src/api/command/os/__mocks__/GetOsVersionCommand.d.ts.map +1 -1
  175. package/lib/types/src/api/device/SecureElementFlags.d.ts +41 -0
  176. package/lib/types/src/api/device/SecureElementFlags.d.ts.map +1 -0
  177. package/lib/types/src/api/device-action/DeviceAction.d.ts +1 -0
  178. package/lib/types/src/api/device-action/DeviceAction.d.ts.map +1 -1
  179. package/lib/types/src/api/device-action/__test-utils__/makeInternalApi.d.ts.map +1 -1
  180. package/lib/types/src/api/device-action/os/ListAppsWithMetadata/ListAppsWithMetadataDeviceAction.d.ts +1 -1
  181. package/lib/types/src/api/device-action/os/ListAppsWithMetadata/ListAppsWithMetadataDeviceAction.d.ts.map +1 -1
  182. package/lib/types/src/api/device-session/DeviceSessionState.d.ts +4 -0
  183. package/lib/types/src/api/device-session/DeviceSessionState.d.ts.map +1 -1
  184. package/lib/types/src/api/device-session/use-case/{ToggleDeviceSessionRefresher.d.ts → DisableDeviceSessionRefresher.d.ts} +6 -6
  185. package/lib/types/src/api/device-session/use-case/DisableDeviceSessionRefresher.d.ts.map +1 -0
  186. package/lib/types/src/api/device-session/use-case/DisableDeviceSessionRefresher.test.d.ts +2 -0
  187. package/lib/types/src/api/device-session/use-case/DisableDeviceSessionRefresher.test.d.ts.map +1 -0
  188. package/lib/types/src/api/index.d.ts +1 -0
  189. package/lib/types/src/api/index.d.ts.map +1 -1
  190. package/lib/types/src/api/secure-channel/constants.d.ts +2 -0
  191. package/lib/types/src/api/secure-channel/constants.d.ts.map +1 -0
  192. package/lib/types/src/api/secure-channel/device-action/GenuineCheck/GenuineCheckDeviceAction.d.ts +8 -0
  193. package/lib/types/src/api/secure-channel/device-action/GenuineCheck/GenuineCheckDeviceAction.d.ts.map +1 -0
  194. package/lib/types/src/api/secure-channel/device-action/GenuineCheck/GenuineCheckDeviceAction.test.d.ts +1 -0
  195. package/lib/types/src/api/secure-channel/device-action/GenuineCheck/GenuineCheckDeviceAction.test.d.ts.map +1 -0
  196. package/lib/types/src/api/secure-channel/device-action/GenuineCheck/types.d.ts +50 -0
  197. package/lib/types/src/api/secure-channel/device-action/GenuineCheck/types.d.ts.map +1 -0
  198. package/lib/types/src/api/secure-channel/task/ConnectToSecureChannelTask.d.ts +23 -0
  199. package/lib/types/src/api/secure-channel/task/ConnectToSecureChannelTask.d.ts.map +1 -0
  200. package/lib/types/src/api/secure-channel/task/ConnectToSecureChannelTask.test.d.ts +2 -0
  201. package/lib/types/src/api/secure-channel/task/ConnectToSecureChannelTask.test.d.ts.map +1 -0
  202. package/lib/types/src/api/secure-channel/task/types.d.ts +105 -0
  203. package/lib/types/src/api/secure-channel/task/types.d.ts.map +1 -0
  204. package/lib/types/src/api/secure-channel/utils.d.ts +30 -0
  205. package/lib/types/src/api/secure-channel/utils.d.ts.map +1 -0
  206. package/lib/types/src/api/secure-channel/utils.test.d.ts +2 -0
  207. package/lib/types/src/api/secure-channel/utils.test.d.ts.map +1 -0
  208. package/lib/types/src/api/transport/model/DeviceConnectionStateMachine.d.ts.map +1 -1
  209. package/lib/types/src/api/transport/model/Errors.d.ts.map +1 -1
  210. package/lib/types/src/api/types.d.ts +1 -0
  211. package/lib/types/src/api/types.d.ts.map +1 -1
  212. package/lib/types/src/internal/device-session/di/deviceSessionTypes.d.ts +1 -1
  213. package/lib/types/src/internal/device-session/model/DeviceSession.d.ts +4 -3
  214. package/lib/types/src/internal/device-session/model/DeviceSession.d.ts.map +1 -1
  215. package/lib/types/src/internal/device-session/model/DeviceSessionRefresher.d.ts.map +1 -1
  216. package/lib/types/src/internal/device-session/service/RefresherService.d.ts +10 -0
  217. package/lib/types/src/internal/device-session/service/RefresherService.d.ts.map +1 -0
  218. package/lib/types/src/internal/device-session/service/RefresherService.test.d.ts +2 -0
  219. package/lib/types/src/internal/device-session/service/RefresherService.test.d.ts.map +1 -0
  220. package/lib/types/src/internal/discovery/use-case/ListenToAvailableDevicesUseCase.d.ts +14 -3
  221. package/lib/types/src/internal/discovery/use-case/ListenToAvailableDevicesUseCase.d.ts.map +1 -1
  222. package/lib/types/src/internal/secure-channel/data/DefaultSecureChannelDataSource.d.ts +3 -3
  223. package/lib/types/src/internal/secure-channel/data/DefaultSecureChannelDataSource.d.ts.map +1 -1
  224. package/lib/types/src/internal/secure-channel/data/SecureChannelDataSource.d.ts +13 -13
  225. package/lib/types/src/internal/secure-channel/data/SecureChannelDataSource.d.ts.map +1 -1
  226. package/lib/types/src/internal/secure-channel/model/Errors.d.ts +6 -0
  227. package/lib/types/src/internal/secure-channel/model/Errors.d.ts.map +1 -1
  228. package/lib/types/src/internal/secure-channel/service/DefaultSecureChannelService.d.ts +3 -3
  229. package/lib/types/src/internal/secure-channel/service/DefaultSecureChannelService.d.ts.map +1 -1
  230. package/lib/types/src/internal/secure-channel/service/SecureChannelService.d.ts +1 -0
  231. package/lib/types/src/internal/secure-channel/service/SecureChannelService.d.ts.map +1 -1
  232. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  233. package/package.json +3 -3
  234. package/lib/cjs/src/api/device-session/use-case/ToggleDeviceSessionRefresher.js +0 -2
  235. package/lib/cjs/src/api/device-session/use-case/ToggleDeviceSessionRefresher.js.map +0 -7
  236. package/lib/cjs/src/api/device-session/use-case/ToggleDeviceSessionRefresher.test.js +0 -2
  237. package/lib/cjs/src/api/device-session/use-case/ToggleDeviceSessionRefresher.test.js.map +0 -7
  238. package/lib/esm/src/api/device-session/use-case/ToggleDeviceSessionRefresher.js +0 -2
  239. package/lib/esm/src/api/device-session/use-case/ToggleDeviceSessionRefresher.js.map +0 -7
  240. package/lib/esm/src/api/device-session/use-case/ToggleDeviceSessionRefresher.test.js +0 -2
  241. package/lib/esm/src/api/device-session/use-case/ToggleDeviceSessionRefresher.test.js.map +0 -7
  242. package/lib/types/src/api/device-session/use-case/ToggleDeviceSessionRefresher.d.ts.map +0 -1
  243. package/lib/types/src/api/device-session/use-case/ToggleDeviceSessionRefresher.test.d.ts +0 -2
  244. package/lib/types/src/api/device-session/use-case/ToggleDeviceSessionRefresher.test.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/device-session/model/DeviceSession.ts"],
4
- "sourcesContent": ["import { type Either, Left } from \"purify-ts\";\nimport { BehaviorSubject, type Subscription } from \"rxjs\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nimport { type Command } from \"@api/command/Command\";\nimport { type CommandResult } from \"@api/command/model/CommandResult\";\nimport { CommandUtils } from \"@api/command/utils/CommandUtils\";\nimport { DeviceStatus } from \"@api/device/DeviceStatus\";\nimport {\n type DeviceAction,\n type DeviceActionIntermediateValue,\n type ExecuteDeviceActionReturnType,\n} from \"@api/device-action/DeviceAction\";\nimport { type ApduResponse } from \"@api/device-session/ApduResponse\";\nimport {\n type DeviceSessionState,\n DeviceSessionStateType,\n} from \"@api/device-session/DeviceSessionState\";\nimport { type DeviceSessionId } from \"@api/device-session/types\";\nimport { DeviceBusyError, type DmkError } from \"@api/Error\";\nimport { type LoggerPublisherService } from \"@api/logger-publisher/service/LoggerPublisherService\";\nimport { type TransportConnectedDevice } from \"@api/transport/model/TransportConnectedDevice\";\nimport { DEVICE_SESSION_REFRESH_INTERVAL } from \"@internal/device-session/data/DeviceSessionRefresherConst\";\nimport { type ManagerApiService } from \"@internal/manager-api/service/ManagerApiService\";\nimport { type SecureChannelService } from \"@internal/secure-channel/service/SecureChannelService\";\n\nimport { DeviceSessionRefresher } from \"./DeviceSessionRefresher\";\n\nexport type SessionConstructorArgs = {\n connectedDevice: TransportConnectedDevice;\n id?: DeviceSessionId;\n};\n\ntype SendApduOptions = {\n isPolling?: boolean;\n triggersDisconnection?: boolean;\n};\n\n/**\n * Represents a session with a device.\n */\nexport class DeviceSession {\n private readonly _id: DeviceSessionId;\n private readonly _connectedDevice: TransportConnectedDevice;\n private readonly _deviceState: BehaviorSubject<DeviceSessionState>;\n private readonly _refresher: DeviceSessionRefresher;\n private readonly _managerApiService: ManagerApiService;\n private readonly _secureChannelService: SecureChannelService;\n\n constructor(\n { connectedDevice, id = uuidv4() }: SessionConstructorArgs,\n loggerModuleFactory: (tag: string) => LoggerPublisherService,\n managerApiService: ManagerApiService,\n secureChannelService: SecureChannelService,\n ) {\n this._id = id;\n this._connectedDevice = connectedDevice;\n this._deviceState = new BehaviorSubject<DeviceSessionState>({\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n deviceModelId: this._connectedDevice.deviceModel.id,\n });\n this._refresher = new DeviceSessionRefresher(\n {\n refreshInterval: DEVICE_SESSION_REFRESH_INTERVAL,\n deviceStatus: DeviceStatus.CONNECTED,\n deviceModelId: this._connectedDevice.deviceModel.id,\n sendApduFn: (rawApdu: Uint8Array) =>\n this.sendApdu(rawApdu, {\n isPolling: true,\n triggersDisconnection: false,\n }),\n updateStateFn: (callback) => {\n const state = this._deviceState.getValue();\n this.setDeviceSessionState(callback(state));\n },\n },\n loggerModuleFactory(\"device-session-refresher\"),\n );\n this._managerApiService = managerApiService;\n this._secureChannelService = secureChannelService;\n }\n\n public get id() {\n return this._id;\n }\n\n public get connectedDevice() {\n return this._connectedDevice;\n }\n\n public get state() {\n return this._deviceState.asObservable();\n }\n\n public setDeviceSessionState(state: DeviceSessionState) {\n this._deviceState.next(state);\n }\n\n private updateDeviceStatus(deviceStatus: DeviceStatus) {\n const sessionState = this._deviceState.getValue();\n this._refresher.setDeviceStatus(deviceStatus);\n this._deviceState.next({\n ...sessionState,\n deviceStatus,\n });\n }\n\n async sendApdu(\n rawApdu: Uint8Array,\n options: SendApduOptions = {\n isPolling: false,\n triggersDisconnection: false,\n },\n ): Promise<Either<DmkError, ApduResponse>> {\n if (!options.isPolling) {\n this.toggleRefresher(false);\n await this.waitUntilReady();\n }\n\n const sessionState = this._deviceState.getValue();\n if (sessionState.deviceStatus === DeviceStatus.BUSY) {\n return Left(new DeviceBusyError());\n }\n\n this.updateDeviceStatus(DeviceStatus.BUSY);\n\n const errorOrResponse = await this._connectedDevice.sendApdu(\n rawApdu,\n options.triggersDisconnection,\n );\n\n return errorOrResponse\n .ifRight((response: ApduResponse) => {\n if (CommandUtils.isLockedDeviceResponse(response)) {\n this.updateDeviceStatus(DeviceStatus.LOCKED);\n } else {\n this.updateDeviceStatus(DeviceStatus.CONNECTED);\n }\n\n if (!options.isPolling) {\n this.toggleRefresher(true);\n }\n })\n .ifLeft(() => {\n this.updateDeviceStatus(DeviceStatus.CONNECTED);\n\n if (!options.isPolling) {\n this.toggleRefresher(true);\n }\n });\n }\n\n async waitUntilReady() {\n let deviceStateSub: Subscription;\n\n await new Promise<void>((resolve) => {\n deviceStateSub = this._deviceState.subscribe((state) => {\n if (state.deviceStatus === DeviceStatus.CONNECTED) {\n deviceStateSub?.unsubscribe();\n resolve();\n }\n });\n });\n }\n\n async sendCommand<Response, Args, ErrorStatusCodes>(\n command: Command<Response, Args, ErrorStatusCodes>,\n ): Promise<CommandResult<Response, ErrorStatusCodes>> {\n const apdu = command.getApdu();\n const response = await this.sendApdu(apdu.getRawApdu(), {\n isPolling: false,\n triggersDisconnection: command.triggersDisconnection ?? false,\n });\n\n return response.caseOf({\n Left: (err) => {\n throw err;\n },\n Right: (r) =>\n command.parseResponse(r, this._connectedDevice.deviceModel.id),\n });\n }\n\n executeDeviceAction<\n Output,\n Input,\n Error extends DmkError,\n IntermediateValue extends DeviceActionIntermediateValue,\n >(\n deviceAction: DeviceAction<Output, Input, Error, IntermediateValue>,\n ): ExecuteDeviceActionReturnType<Output, Error, IntermediateValue> {\n const { observable, cancel } = deviceAction._execute({\n sendApdu: async (apdu: Uint8Array) => this.sendApdu(apdu),\n sendCommand: async <Response, ErrorStatusCodes, Args>(\n command: Command<Response, ErrorStatusCodes, Args>,\n ) => this.sendCommand(command),\n getDeviceSessionState: () => this._deviceState.getValue(),\n getDeviceSessionStateObservable: () => this.state,\n setDeviceSessionState: (state: DeviceSessionState) => {\n this.setDeviceSessionState(state);\n return this._deviceState.getValue();\n },\n getManagerApiService: () => this._managerApiService,\n getSecureChannelService: () => this._secureChannelService,\n });\n\n return {\n observable,\n cancel,\n };\n }\n\n close() {\n this.updateDeviceStatus(DeviceStatus.NOT_CONNECTED);\n this._deviceState.complete();\n this._refresher.stop();\n }\n\n toggleRefresher(enabled: boolean) {\n if (enabled) {\n this._refresher.start();\n } else {\n this._refresher.stop();\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["Left", "BehaviorSubject", "uuidv4", "CommandUtils", "DeviceStatus", "DeviceSessionStateType", "DeviceBusyError", "DEVICE_SESSION_REFRESH_INTERVAL", "DeviceSessionRefresher", "DeviceSession", "connectedDevice", "id", "loggerModuleFactory", "managerApiService", "secureChannelService", "rawApdu", "callback", "state", "deviceStatus", "sessionState", "options", "response", "deviceStateSub", "resolve", "command", "apdu", "err", "r", "deviceAction", "observable", "cancel", "enabled"]
4
+ "sourcesContent": ["import { type Either, Left } from \"purify-ts\";\nimport { BehaviorSubject, type Subscription } from \"rxjs\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nimport { type Command } from \"@api/command/Command\";\nimport { type CommandResult } from \"@api/command/model/CommandResult\";\nimport { CommandUtils } from \"@api/command/utils/CommandUtils\";\nimport { DeviceStatus } from \"@api/device/DeviceStatus\";\nimport {\n type DeviceAction,\n type DeviceActionIntermediateValue,\n type ExecuteDeviceActionReturnType,\n} from \"@api/device-action/DeviceAction\";\nimport { type ApduResponse } from \"@api/device-session/ApduResponse\";\nimport {\n type DeviceSessionState,\n DeviceSessionStateType,\n} from \"@api/device-session/DeviceSessionState\";\nimport { type DeviceSessionId } from \"@api/device-session/types\";\nimport { DeviceBusyError, type DmkError } from \"@api/Error\";\nimport { type LoggerPublisherService } from \"@api/logger-publisher/service/LoggerPublisherService\";\nimport { type TransportConnectedDevice } from \"@api/transport/model/TransportConnectedDevice\";\nimport { DEVICE_SESSION_REFRESH_INTERVAL } from \"@internal/device-session/data/DeviceSessionRefresherConst\";\nimport { RefresherService } from \"@internal/device-session/service/RefresherService\";\nimport { type ManagerApiService } from \"@internal/manager-api/service/ManagerApiService\";\nimport { type SecureChannelService } from \"@internal/secure-channel/service/SecureChannelService\";\n\nimport { DeviceSessionRefresher } from \"./DeviceSessionRefresher\";\n\nexport type SessionConstructorArgs = {\n connectedDevice: TransportConnectedDevice;\n id?: DeviceSessionId;\n};\n\ntype SendApduOptions = {\n isPolling?: boolean;\n triggersDisconnection?: boolean;\n};\n\n/**\n * Represents a session with a device.\n */\nexport class DeviceSession {\n private readonly _id: DeviceSessionId;\n private readonly _connectedDevice: TransportConnectedDevice;\n private readonly _deviceState: BehaviorSubject<DeviceSessionState>;\n private readonly _refresher: DeviceSessionRefresher;\n private readonly _refresherService: RefresherService;\n private readonly _managerApiService: ManagerApiService;\n private readonly _secureChannelService: SecureChannelService;\n\n constructor(\n { connectedDevice, id = uuidv4() }: SessionConstructorArgs,\n loggerModuleFactory: (tag: string) => LoggerPublisherService,\n managerApiService: ManagerApiService,\n secureChannelService: SecureChannelService,\n ) {\n this._id = id;\n this._connectedDevice = connectedDevice;\n this._deviceState = new BehaviorSubject<DeviceSessionState>({\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n deviceModelId: this._connectedDevice.deviceModel.id,\n });\n this._refresher = new DeviceSessionRefresher(\n {\n refreshInterval: DEVICE_SESSION_REFRESH_INTERVAL,\n deviceStatus: DeviceStatus.CONNECTED,\n deviceModelId: this._connectedDevice.deviceModel.id,\n sendApduFn: (rawApdu: Uint8Array) =>\n this.sendApdu(rawApdu, {\n isPolling: true,\n triggersDisconnection: false,\n }),\n updateStateFn: (callback) => {\n const state = this._deviceState.getValue();\n this.setDeviceSessionState(callback(state));\n },\n },\n loggerModuleFactory(\"device-session-refresher\"),\n );\n this._refresherService = new RefresherService(this._refresher);\n this._managerApiService = managerApiService;\n this._secureChannelService = secureChannelService;\n }\n\n public get id() {\n return this._id;\n }\n\n public get connectedDevice() {\n return this._connectedDevice;\n }\n\n public get state() {\n return this._deviceState.asObservable();\n }\n\n public setDeviceSessionState(state: DeviceSessionState) {\n this._deviceState.next(state);\n }\n\n public async sendApdu(\n rawApdu: Uint8Array,\n options: SendApduOptions = {\n isPolling: false,\n triggersDisconnection: false,\n },\n ): Promise<Either<DmkError, ApduResponse>> {\n let reenableRefresher: () => void;\n if (!options.isPolling) {\n reenableRefresher = this._refresherService.disableRefresher(\"sendApdu\");\n await this.waitUntilReady();\n }\n\n const sessionState = this._deviceState.getValue();\n if (sessionState.deviceStatus === DeviceStatus.BUSY) {\n return Left(new DeviceBusyError());\n }\n\n this.updateDeviceStatus(DeviceStatus.BUSY);\n\n const errorOrResponse = await this._connectedDevice.sendApdu(\n rawApdu,\n options.triggersDisconnection,\n );\n\n return errorOrResponse\n .ifRight((response: ApduResponse) => {\n if (CommandUtils.isLockedDeviceResponse(response)) {\n this.updateDeviceStatus(DeviceStatus.LOCKED);\n } else {\n this.updateDeviceStatus(DeviceStatus.CONNECTED);\n }\n\n if (!options.isPolling && reenableRefresher) {\n reenableRefresher();\n }\n })\n .ifLeft(() => {\n this.updateDeviceStatus(DeviceStatus.CONNECTED);\n\n if (!options.isPolling && reenableRefresher) {\n reenableRefresher();\n }\n });\n }\n\n public async sendCommand<Response, Args, ErrorStatusCodes>(\n command: Command<Response, Args, ErrorStatusCodes>,\n ): Promise<CommandResult<Response, ErrorStatusCodes>> {\n const apdu = command.getApdu();\n const response = await this.sendApdu(apdu.getRawApdu(), {\n isPolling: false,\n triggersDisconnection: command.triggersDisconnection ?? false,\n });\n\n return response.caseOf({\n Left: (err) => {\n throw err;\n },\n Right: (r) =>\n command.parseResponse(r, this._connectedDevice.deviceModel.id),\n });\n }\n\n public executeDeviceAction<\n Output,\n Input,\n Error extends DmkError,\n IntermediateValue extends DeviceActionIntermediateValue,\n >(\n deviceAction: DeviceAction<Output, Input, Error, IntermediateValue>,\n ): ExecuteDeviceActionReturnType<Output, Error, IntermediateValue> {\n const { observable, cancel } = deviceAction._execute({\n sendApdu: async (apdu: Uint8Array) => this.sendApdu(apdu),\n sendCommand: async <Response, ErrorStatusCodes, Args>(\n command: Command<Response, ErrorStatusCodes, Args>,\n ) => this.sendCommand(command),\n getDeviceSessionState: () => this._deviceState.getValue(),\n getDeviceSessionStateObservable: () => this.state,\n setDeviceSessionState: (state: DeviceSessionState) => {\n this.setDeviceSessionState(state);\n return this._deviceState.getValue();\n },\n disableRefresher: (blockerId: string) =>\n this._refresherService.disableRefresher(blockerId),\n getManagerApiService: () => this._managerApiService,\n getSecureChannelService: () => this._secureChannelService,\n });\n\n return {\n observable,\n cancel,\n };\n }\n\n public close() {\n this.updateDeviceStatus(DeviceStatus.NOT_CONNECTED);\n this._deviceState.complete();\n this._refresher.stop();\n }\n\n public disableRefresher(id: string): () => void {\n return this._refresherService.disableRefresher(id);\n }\n\n private updateDeviceStatus(deviceStatus: DeviceStatus) {\n const sessionState = this._deviceState.getValue();\n this._refresher.setDeviceStatus(deviceStatus);\n this._deviceState.next({\n ...sessionState,\n deviceStatus,\n });\n }\n\n private async waitUntilReady() {\n let deviceStateSub: Subscription;\n\n await new Promise<void>((resolve) => {\n deviceStateSub = this._deviceState.subscribe((state) => {\n if (state.deviceStatus === DeviceStatus.CONNECTED) {\n deviceStateSub?.unsubscribe();\n resolve();\n }\n });\n });\n }\n}\n"],
5
+ "mappings": "AAAA,OAAsB,QAAAA,MAAY,YAClC,OAAS,mBAAAC,MAA0C,OACnD,OAAS,MAAMC,MAAc,OAI7B,OAAS,gBAAAC,MAAoB,kCAC7B,OAAS,gBAAAC,MAAoB,2BAO7B,OAEE,0BAAAC,MACK,yCAEP,OAAS,mBAAAC,MAAsC,aAG/C,OAAS,mCAAAC,MAAuC,4DAChD,OAAS,oBAAAC,MAAwB,oDAIjC,OAAS,0BAAAC,MAA8B,2BAehC,MAAMC,CAAc,CACR,IACA,iBACA,aACA,WACA,kBACA,mBACA,sBAEjB,YACE,CAAE,gBAAAC,EAAiB,GAAAC,EAAKV,EAAO,CAAE,EACjCW,EACAC,EACAC,EACA,CACA,KAAK,IAAMH,EACX,KAAK,iBAAmBD,EACxB,KAAK,aAAe,IAAIV,EAAoC,CAC1D,iBAAkBI,EAAuB,UACzC,aAAcD,EAAa,UAC3B,cAAe,KAAK,iBAAiB,YAAY,EACnD,CAAC,EACD,KAAK,WAAa,IAAIK,EACpB,CACE,gBAAiBF,EACjB,aAAcH,EAAa,UAC3B,cAAe,KAAK,iBAAiB,YAAY,GACjD,WAAaY,GACX,KAAK,SAASA,EAAS,CACrB,UAAW,GACX,sBAAuB,EACzB,CAAC,EACH,cAAgBC,GAAa,CAC3B,MAAMC,EAAQ,KAAK,aAAa,SAAS,EACzC,KAAK,sBAAsBD,EAASC,CAAK,CAAC,CAC5C,CACF,EACAL,EAAoB,0BAA0B,CAChD,EACA,KAAK,kBAAoB,IAAIL,EAAiB,KAAK,UAAU,EAC7D,KAAK,mBAAqBM,EAC1B,KAAK,sBAAwBC,CAC/B,CAEA,IAAW,IAAK,CACd,OAAO,KAAK,GACd,CAEA,IAAW,iBAAkB,CAC3B,OAAO,KAAK,gBACd,CAEA,IAAW,OAAQ,CACjB,OAAO,KAAK,aAAa,aAAa,CACxC,CAEO,sBAAsBG,EAA2B,CACtD,KAAK,aAAa,KAAKA,CAAK,CAC9B,CAEA,MAAa,SACXF,EACAG,EAA2B,CACzB,UAAW,GACX,sBAAuB,EACzB,EACyC,CACzC,IAAIC,EAOJ,OANKD,EAAQ,YACXC,EAAoB,KAAK,kBAAkB,iBAAiB,UAAU,EACtE,MAAM,KAAK,eAAe,GAGP,KAAK,aAAa,SAAS,EAC/B,eAAiBhB,EAAa,KACtCJ,EAAK,IAAIM,CAAiB,GAGnC,KAAK,mBAAmBF,EAAa,IAAI,GAEjB,MAAM,KAAK,iBAAiB,SAClDY,EACAG,EAAQ,qBACV,GAGG,QAASE,GAA2B,CAC/BlB,EAAa,uBAAuBkB,CAAQ,EAC9C,KAAK,mBAAmBjB,EAAa,MAAM,EAE3C,KAAK,mBAAmBA,EAAa,SAAS,EAG5C,CAACe,EAAQ,WAAaC,GACxBA,EAAkB,CAEtB,CAAC,EACA,OAAO,IAAM,CACZ,KAAK,mBAAmBhB,EAAa,SAAS,EAE1C,CAACe,EAAQ,WAAaC,GACxBA,EAAkB,CAEtB,CAAC,EACL,CAEA,MAAa,YACXE,EACoD,CACpD,MAAMC,EAAOD,EAAQ,QAAQ,EAM7B,OALiB,MAAM,KAAK,SAASC,EAAK,WAAW,EAAG,CACtD,UAAW,GACX,sBAAuBD,EAAQ,uBAAyB,EAC1D,CAAC,GAEe,OAAO,CACrB,KAAOE,GAAQ,CACb,MAAMA,CACR,EACA,MAAQC,GACNH,EAAQ,cAAcG,EAAG,KAAK,iBAAiB,YAAY,EAAE,CACjE,CAAC,CACH,CAEO,oBAMLC,EACiE,CACjE,KAAM,CAAE,WAAAC,EAAY,OAAAC,CAAO,EAAIF,EAAa,SAAS,CACnD,SAAU,MAAOH,GAAqB,KAAK,SAASA,CAAI,EACxD,YAAa,MACXD,GACG,KAAK,YAAYA,CAAO,EAC7B,sBAAuB,IAAM,KAAK,aAAa,SAAS,EACxD,gCAAiC,IAAM,KAAK,MAC5C,sBAAwBJ,IACtB,KAAK,sBAAsBA,CAAK,EACzB,KAAK,aAAa,SAAS,GAEpC,iBAAmBW,GACjB,KAAK,kBAAkB,iBAAiBA,CAAS,EACnD,qBAAsB,IAAM,KAAK,mBACjC,wBAAyB,IAAM,KAAK,qBACtC,CAAC,EAED,MAAO,CACL,WAAAF,EACA,OAAAC,CACF,CACF,CAEO,OAAQ,CACb,KAAK,mBAAmBxB,EAAa,aAAa,EAClD,KAAK,aAAa,SAAS,EAC3B,KAAK,WAAW,KAAK,CACvB,CAEO,iBAAiBQ,EAAwB,CAC9C,OAAO,KAAK,kBAAkB,iBAAiBA,CAAE,CACnD,CAEQ,mBAAmBkB,EAA4B,CACrD,MAAMC,EAAe,KAAK,aAAa,SAAS,EAChD,KAAK,WAAW,gBAAgBD,CAAY,EAC5C,KAAK,aAAa,KAAK,CACrB,GAAGC,EACH,aAAAD,CACF,CAAC,CACH,CAEA,MAAc,gBAAiB,CAC7B,IAAIE,EAEJ,MAAM,IAAI,QAAeC,GAAY,CACnCD,EAAiB,KAAK,aAAa,UAAWd,GAAU,CAClDA,EAAM,eAAiBd,EAAa,YACtC4B,GAAgB,YAAY,EAC5BC,EAAQ,EAEZ,CAAC,CACH,CAAC,CACH,CACF",
6
+ "names": ["Left", "BehaviorSubject", "uuidv4", "CommandUtils", "DeviceStatus", "DeviceSessionStateType", "DeviceBusyError", "DEVICE_SESSION_REFRESH_INTERVAL", "RefresherService", "DeviceSessionRefresher", "DeviceSession", "connectedDevice", "id", "loggerModuleFactory", "managerApiService", "secureChannelService", "rawApdu", "callback", "state", "options", "reenableRefresher", "response", "command", "apdu", "err", "r", "deviceAction", "observable", "cancel", "blockerId", "deviceStatus", "sessionState", "deviceStateSub", "resolve"]
7
7
  }
@@ -1,2 +1,2 @@
1
- var h=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var u=(p,t,e,r)=>{for(var s=r>1?void 0:r?v(t,e):t,i=p.length-1,n;i>=0;i--)(n=p[i])&&(s=(r?n(t,e,s):n(s))||s);return r&&s&&h(t,e,s),s};import{injectable as _}from"inversify";import{delay as b,filter as l,from as S,interval as c,map as m,of as A,race as g,switchMap as d}from"rxjs";import{isSuccessCommandResult as f}from"../../../api/command/model/CommandResult";import{GetAppAndVersionCommand as O}from"../../../api/command/os/GetAppAndVersionCommand";import{GetOsVersionCommand as y}from"../../../api/command/os/GetOsVersionCommand";import{DeviceModelId as D}from"../../../api/device/DeviceModel";import{DeviceStatus as a}from"../../../api/device/DeviceStatus";import{DeviceSessionStateType as C}from"../../../api/device-session/DeviceSessionState";let o=class{_logger;_getAppAndVersionCommand=new O;_getOsVersionCommand=new y;_deviceStatus;_subscription;_refreshInterval;_deviceModelId;_sendApduFn;_updateStateFn;constructor({refreshInterval:t,deviceStatus:e,sendApduFn:r,updateStateFn:s,deviceModelId:i},n){this._deviceStatus=e,this._logger=n,this._sendApduFn=r,this._updateStateFn=s,this._refreshInterval=t,this._deviceModelId=i,this.start()}start(){if(this._subscription&&!this._subscription.closed){this._logger.warn("Refresher already started");return}const t=this._deviceModelId===D.NANO_S?this._getNanoSRefreshObservable(this._refreshInterval*2):this._getDefaultRefreshObservable(c(this._refreshInterval));this._subscription=t.subscribe(e=>{!e||!f(e)||this._updateStateFn(r=>({...r,sessionStateType:C.ReadyWithoutSecureChannel,deviceStatus:this._deviceStatus,currentApp:e.data,installedApps:"installedApps"in r?r.installedApps:[]}))})}_getDefaultRefreshObservable(t=S([0])){return t.pipe(l(()=>![a.BUSY,a.NOT_CONNECTED].includes(this._deviceStatus)),d(async()=>{const e=this._getAppAndVersionCommand.getApdu().getRawApdu();return await this._sendApduFn(e)}),m(e=>e.caseOf({Left:r=>(this._logger.error("Error in sending APDU when polling",{data:{error:r}}),null),Right:r=>{try{return this._getAppAndVersionCommand.parseResponse(r)}catch(s){return this._logger.error("Error in parsing APDU response",{data:{error:s}}),null}}})),l(e=>e!==null))}_getNanoSRefreshObservable(t){const e=this._getDefaultRefreshObservable().pipe(d(async s=>{const i=this._getOsVersionCommand.getApdu().getRawApdu();return await this._sendApduFn(i),s})),r=A(null).pipe(b(t),m(s=>{this._logger.warn("Nanos refresh timeout, setting device status to LOCKED"),this._updateStateFn(i=>({...i,deviceStatus:a.LOCKED}))}));return c(t+100).pipe(d(()=>g(e,r)))}setDeviceStatus(t){t===a.NOT_CONNECTED&&this.stop(),this._deviceStatus=t}stop(){!this._subscription||this._subscription.closed||(this._subscription.unsubscribe(),this._subscription=void 0)}};o=u([_()],o);export{o as DeviceSessionRefresher};
1
+ var h=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var u=(p,r,t,e)=>{for(var s=e>1?void 0:e?v(r,t):r,i=p.length-1,n;i>=0;i--)(n=p[i])&&(s=(e?n(r,t,s):n(s))||s);return e&&s&&h(r,t,s),s};import{injectable as _}from"inversify";import{delay as b,filter as l,from as S,interval as c,map as m,of as A,race as f,switchMap as d}from"rxjs";import{isSuccessCommandResult as g}from"../../../api/command/model/CommandResult";import{GetAppAndVersionCommand as O}from"../../../api/command/os/GetAppAndVersionCommand";import{GetOsVersionCommand as y}from"../../../api/command/os/GetOsVersionCommand";import{DeviceModelId as D}from"../../../api/device/DeviceModel";import{DeviceStatus as o}from"../../../api/device/DeviceStatus";import{DeviceSessionStateType as C}from"../../../api/device-session/DeviceSessionState";let a=class{_logger;_getAppAndVersionCommand=new O;_getOsVersionCommand=new y;_deviceStatus;_subscription;_refreshInterval;_deviceModelId;_sendApduFn;_updateStateFn;constructor({refreshInterval:r,deviceStatus:t,sendApduFn:e,updateStateFn:s,deviceModelId:i},n){this._deviceStatus=t,this._logger=n,this._sendApduFn=e,this._updateStateFn=s,this._refreshInterval=r,this._deviceModelId=i,this.start()}start(){if(this._subscription&&!this._subscription.closed){this._logger.warn("Refresher already started");return}const r=this._deviceModelId===D.NANO_S?this._getNanoSRefreshObservable(this._refreshInterval*2):this._getDefaultRefreshObservable(c(this._refreshInterval));this._subscription=r.subscribe(t=>{!t||!g(t)||this._updateStateFn(e=>({...e,sessionStateType:C.ReadyWithoutSecureChannel,deviceStatus:this._deviceStatus,currentApp:t.data,installedApps:"installedApps"in e?e.installedApps:[],isSecureConnectionAllowed:"isSecureConnectionAllowed"in e?e.isSecureConnectionAllowed:!1}))})}_getDefaultRefreshObservable(r=S([0])){return r.pipe(l(()=>![o.BUSY,o.NOT_CONNECTED].includes(this._deviceStatus)),d(async()=>{const t=this._getAppAndVersionCommand.getApdu().getRawApdu();return await this._sendApduFn(t)}),m(t=>t.caseOf({Left:e=>(this._logger.error("Error in sending APDU when polling",{data:{error:e}}),null),Right:e=>{try{return this._getAppAndVersionCommand.parseResponse(e)}catch(s){return this._logger.error("Error in parsing APDU response",{data:{error:s}}),null}}})),l(t=>t!==null))}_getNanoSRefreshObservable(r){const t=this._getDefaultRefreshObservable().pipe(d(async s=>{const i=this._getOsVersionCommand.getApdu().getRawApdu();return await this._sendApduFn(i),s})),e=A(null).pipe(b(r),m(s=>{this._logger.warn("Nanos refresh timeout, setting device status to LOCKED"),this._updateStateFn(i=>({...i,deviceStatus:o.LOCKED}))}));return c(r+100).pipe(d(()=>f(t,e)))}setDeviceStatus(r){r===o.NOT_CONNECTED&&this.stop(),this._deviceStatus=r}stop(){!this._subscription||this._subscription.closed||(this._subscription.unsubscribe(),this._subscription=void 0)}};a=u([_()],a);export{a as DeviceSessionRefresher};
2
2
  //# sourceMappingURL=DeviceSessionRefresher.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/device-session/model/DeviceSessionRefresher.ts"],
4
- "sourcesContent": ["import { injectable } from \"inversify\";\nimport { Either } from \"purify-ts\";\nimport {\n delay,\n filter,\n from,\n interval,\n map,\n Observable,\n of,\n race,\n Subscription,\n switchMap,\n} from \"rxjs\";\n\nimport { isSuccessCommandResult } from \"@api/command/model/CommandResult\";\nimport {\n GetAppAndVersionCommand,\n GetAppAndVersionCommandResult,\n} from \"@api/command/os/GetAppAndVersionCommand\";\nimport { GetOsVersionCommand } from \"@api/command/os/GetOsVersionCommand\";\nimport { DeviceModelId } from \"@api/device/DeviceModel\";\nimport { DeviceStatus } from \"@api/device/DeviceStatus\";\nimport { ApduResponse } from \"@api/device-session/ApduResponse\";\nimport {\n DeviceSessionState,\n DeviceSessionStateType,\n} from \"@api/device-session/DeviceSessionState\";\nimport { DmkError } from \"@api/Error\";\nimport { type LoggerPublisherService } from \"@api/logger-publisher/service/LoggerPublisherService\";\nimport { SendApduFnType } from \"@api/transport/model/DeviceConnection\";\n\ntype UpdateStateFnType = (\n callback: (state: DeviceSessionState) => DeviceSessionState,\n) => void;\n\n/**\n * The arguments for the DeviceSessionRefresher.\n */\nexport type DeviceSessionRefresherArgs = {\n /**\n * The refresh interval in milliseconds.\n */\n refreshInterval: number;\n\n /**\n * The current device status when the refresher is created.\n */\n deviceStatus: Exclude<DeviceStatus, DeviceStatus.NOT_CONNECTED>;\n\n /**\n * The function used to send APDU commands to the device.\n */\n sendApduFn: (rawApdu: Uint8Array) => Promise<Either<DmkError, ApduResponse>>;\n\n /**\n * Callback that updates the state of the device session with\n * polling response.\n * @param callback - A function that will take the previous state and return the new state.\n * @returns void\n */\n updateStateFn: UpdateStateFnType;\n\n /**\n * Device model to handle NanoS specific refresher\n */\n deviceModelId: DeviceModelId;\n};\n\n/**\n * The session refresher that periodically sends a command to refresh the session.\n */\n@injectable()\nexport class DeviceSessionRefresher {\n private readonly _logger: LoggerPublisherService;\n private readonly _getAppAndVersionCommand = new GetAppAndVersionCommand();\n private readonly _getOsVersionCommand = new GetOsVersionCommand();\n private _deviceStatus: DeviceStatus;\n private _subscription?: Subscription;\n private readonly _refreshInterval: number;\n private readonly _deviceModelId: DeviceModelId;\n private readonly _sendApduFn: SendApduFnType;\n private readonly _updateStateFn: UpdateStateFnType;\n\n constructor(\n {\n refreshInterval,\n deviceStatus,\n sendApduFn,\n updateStateFn,\n deviceModelId,\n }: DeviceSessionRefresherArgs,\n logger: LoggerPublisherService,\n ) {\n this._deviceStatus = deviceStatus;\n this._logger = logger;\n this._sendApduFn = sendApduFn;\n this._updateStateFn = updateStateFn;\n this._refreshInterval = refreshInterval;\n this._deviceModelId = deviceModelId;\n\n this.start();\n }\n\n /**\n * Start the session refresher.\n * The refresher will send commands to refresh the session.\n */\n start() {\n if (this._subscription && !this._subscription.closed) {\n this._logger.warn(\"Refresher already started\");\n return;\n }\n\n // NanoS has a specific refresher that sends GetAppAndVersion and GetOsVersion commands\n const refreshObservable =\n this._deviceModelId === DeviceModelId.NANO_S\n ? this._getNanoSRefreshObservable(this._refreshInterval * 2)\n : this._getDefaultRefreshObservable(interval(this._refreshInterval));\n\n this._subscription = refreshObservable.subscribe((parsedResponse) => {\n if (!parsedResponse || !isSuccessCommandResult(parsedResponse)) {\n return;\n }\n // `batteryStatus` and `firmwareVersion` are not available in the polling response.\n this._updateStateFn((state) => ({\n ...state,\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: this._deviceStatus,\n currentApp: parsedResponse.data,\n installedApps: \"installedApps\" in state ? state.installedApps : [],\n }));\n });\n }\n\n /**\n * Creates an observable that refreshes a device state with GetAppAndVersion command result.\n *\n * @param {ObservableInput<number>} parentObservable - The parent observable to base the refresh observable on. Defaults to an array with a single number [0].\n * @return {Observable<GetAppAndVersionCommandResult>} An observable that emits the result of the GetAppAndVersionCommand.\n */\n private _getDefaultRefreshObservable(\n parentObservable: Observable<number> = from([0]),\n ): Observable<GetAppAndVersionCommandResult> {\n return parentObservable.pipe(\n filter(\n () =>\n ![DeviceStatus.BUSY, DeviceStatus.NOT_CONNECTED].includes(\n this._deviceStatus,\n ),\n ),\n switchMap(async () => {\n const rawApdu = this._getAppAndVersionCommand.getApdu().getRawApdu();\n return await this._sendApduFn(rawApdu);\n }),\n map((resp) =>\n resp.caseOf({\n Left: (error) => {\n this._logger.error(\"Error in sending APDU when polling\", {\n data: { error },\n });\n return null;\n },\n Right: (data: ApduResponse) => {\n try {\n return this._getAppAndVersionCommand.parseResponse(data);\n } catch (error) {\n this._logger.error(\"Error in parsing APDU response\", {\n data: { error },\n });\n return null;\n }\n },\n }),\n ),\n filter((parsedResponse) => parsedResponse !== null),\n );\n }\n\n /**\n * Creates an observable that emits events to refresh the NanoS device state.\n *\n * @param {number} refreshInterval - The interval, in milliseconds, at which the NanoS state should be refreshed.\n * @return {Observable<GetAppAndVersionCommandResult | void>} An observable that emits events to refresh the NanoS device state and handle timeout scenarios.\n */\n private _getNanoSRefreshObservable(\n refreshInterval: number,\n ): Observable<GetAppAndVersionCommandResult | void> {\n const nanoSRefreshObservable = this._getDefaultRefreshObservable().pipe(\n switchMap(async (resp) => {\n const rawApdu = this._getOsVersionCommand.getApdu().getRawApdu();\n await this._sendApduFn(rawApdu);\n return resp;\n }),\n );\n const timeoutObservable = of(null).pipe(\n delay(refreshInterval),\n map((_) => {\n this._logger.warn(\n \"Nanos refresh timeout, setting device status to LOCKED\",\n );\n this._updateStateFn((state) => ({\n ...state,\n deviceStatus: DeviceStatus.LOCKED,\n }));\n }),\n );\n return interval(refreshInterval + 100).pipe(\n switchMap(() => race(nanoSRefreshObservable, timeoutObservable)),\n );\n }\n\n /**\n * Maintain a device status to prevent sending APDU when the device is busy.\n *\n * @param {DeviceStatus} deviceStatus - The new device status.\n */\n setDeviceStatus(deviceStatus: DeviceStatus) {\n if (deviceStatus === DeviceStatus.NOT_CONNECTED) {\n this.stop();\n }\n this._deviceStatus = deviceStatus;\n }\n\n /**\n * Stops the session refresher.\n * The refresher will no longer send commands to refresh the session.\n */\n stop() {\n if (!this._subscription || this._subscription.closed) {\n return;\n }\n this._subscription.unsubscribe();\n this._subscription = undefined;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { injectable } from \"inversify\";\nimport { Either } from \"purify-ts\";\nimport {\n delay,\n filter,\n from,\n interval,\n map,\n Observable,\n of,\n race,\n Subscription,\n switchMap,\n} from \"rxjs\";\n\nimport { isSuccessCommandResult } from \"@api/command/model/CommandResult\";\nimport {\n GetAppAndVersionCommand,\n GetAppAndVersionCommandResult,\n} from \"@api/command/os/GetAppAndVersionCommand\";\nimport { GetOsVersionCommand } from \"@api/command/os/GetOsVersionCommand\";\nimport { DeviceModelId } from \"@api/device/DeviceModel\";\nimport { DeviceStatus } from \"@api/device/DeviceStatus\";\nimport { ApduResponse } from \"@api/device-session/ApduResponse\";\nimport {\n DeviceSessionState,\n DeviceSessionStateType,\n} from \"@api/device-session/DeviceSessionState\";\nimport { DmkError } from \"@api/Error\";\nimport { type LoggerPublisherService } from \"@api/logger-publisher/service/LoggerPublisherService\";\nimport { SendApduFnType } from \"@api/transport/model/DeviceConnection\";\n\ntype UpdateStateFnType = (\n callback: (state: DeviceSessionState) => DeviceSessionState,\n) => void;\n\n/**\n * The arguments for the DeviceSessionRefresher.\n */\nexport type DeviceSessionRefresherArgs = {\n /**\n * The refresh interval in milliseconds.\n */\n refreshInterval: number;\n\n /**\n * The current device status when the refresher is created.\n */\n deviceStatus: Exclude<DeviceStatus, DeviceStatus.NOT_CONNECTED>;\n\n /**\n * The function used to send APDU commands to the device.\n */\n sendApduFn: (rawApdu: Uint8Array) => Promise<Either<DmkError, ApduResponse>>;\n\n /**\n * Callback that updates the state of the device session with\n * polling response.\n * @param callback - A function that will take the previous state and return the new state.\n * @returns void\n */\n updateStateFn: UpdateStateFnType;\n\n /**\n * Device model to handle NanoS specific refresher\n */\n deviceModelId: DeviceModelId;\n};\n\n/**\n * The session refresher that periodically sends a command to refresh the session.\n */\n@injectable()\nexport class DeviceSessionRefresher {\n private readonly _logger: LoggerPublisherService;\n private readonly _getAppAndVersionCommand = new GetAppAndVersionCommand();\n private readonly _getOsVersionCommand = new GetOsVersionCommand();\n private _deviceStatus: DeviceStatus;\n private _subscription?: Subscription;\n private readonly _refreshInterval: number;\n private readonly _deviceModelId: DeviceModelId;\n private readonly _sendApduFn: SendApduFnType;\n private readonly _updateStateFn: UpdateStateFnType;\n\n constructor(\n {\n refreshInterval,\n deviceStatus,\n sendApduFn,\n updateStateFn,\n deviceModelId,\n }: DeviceSessionRefresherArgs,\n logger: LoggerPublisherService,\n ) {\n this._deviceStatus = deviceStatus;\n this._logger = logger;\n this._sendApduFn = sendApduFn;\n this._updateStateFn = updateStateFn;\n this._refreshInterval = refreshInterval;\n this._deviceModelId = deviceModelId;\n\n this.start();\n }\n\n /**\n * Start the session refresher.\n * The refresher will send commands to refresh the session.\n */\n start() {\n if (this._subscription && !this._subscription.closed) {\n this._logger.warn(\"Refresher already started\");\n return;\n }\n\n // NanoS has a specific refresher that sends GetAppAndVersion and GetOsVersion commands\n const refreshObservable =\n this._deviceModelId === DeviceModelId.NANO_S\n ? this._getNanoSRefreshObservable(this._refreshInterval * 2)\n : this._getDefaultRefreshObservable(interval(this._refreshInterval));\n\n this._subscription = refreshObservable.subscribe((parsedResponse) => {\n if (!parsedResponse || !isSuccessCommandResult(parsedResponse)) {\n return;\n }\n // `batteryStatus` and `firmwareVersion` are not available in the polling response.\n this._updateStateFn((state) => ({\n ...state,\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: this._deviceStatus,\n currentApp: parsedResponse.data,\n installedApps: \"installedApps\" in state ? state.installedApps : [],\n isSecureConnectionAllowed:\n \"isSecureConnectionAllowed\" in state\n ? state.isSecureConnectionAllowed\n : false,\n }));\n });\n }\n\n /**\n * Creates an observable that refreshes a device state with GetAppAndVersion command result.\n *\n * @param {ObservableInput<number>} parentObservable - The parent observable to base the refresh observable on. Defaults to an array with a single number [0].\n * @return {Observable<GetAppAndVersionCommandResult>} An observable that emits the result of the GetAppAndVersionCommand.\n */\n private _getDefaultRefreshObservable(\n parentObservable: Observable<number> = from([0]),\n ): Observable<GetAppAndVersionCommandResult> {\n return parentObservable.pipe(\n filter(\n () =>\n ![DeviceStatus.BUSY, DeviceStatus.NOT_CONNECTED].includes(\n this._deviceStatus,\n ),\n ),\n switchMap(async () => {\n const rawApdu = this._getAppAndVersionCommand.getApdu().getRawApdu();\n return await this._sendApduFn(rawApdu);\n }),\n map((resp) =>\n resp.caseOf({\n Left: (error) => {\n this._logger.error(\"Error in sending APDU when polling\", {\n data: { error },\n });\n return null;\n },\n Right: (data: ApduResponse) => {\n try {\n return this._getAppAndVersionCommand.parseResponse(data);\n } catch (error) {\n this._logger.error(\"Error in parsing APDU response\", {\n data: { error },\n });\n return null;\n }\n },\n }),\n ),\n filter((parsedResponse) => parsedResponse !== null),\n );\n }\n\n /**\n * Creates an observable that emits events to refresh the NanoS device state.\n *\n * @param {number} refreshInterval - The interval, in milliseconds, at which the NanoS state should be refreshed.\n * @return {Observable<GetAppAndVersionCommandResult | void>} An observable that emits events to refresh the NanoS device state and handle timeout scenarios.\n */\n private _getNanoSRefreshObservable(\n refreshInterval: number,\n ): Observable<GetAppAndVersionCommandResult | void> {\n const nanoSRefreshObservable = this._getDefaultRefreshObservable().pipe(\n switchMap(async (resp) => {\n const rawApdu = this._getOsVersionCommand.getApdu().getRawApdu();\n await this._sendApduFn(rawApdu);\n return resp;\n }),\n );\n const timeoutObservable = of(null).pipe(\n delay(refreshInterval),\n map((_) => {\n this._logger.warn(\n \"Nanos refresh timeout, setting device status to LOCKED\",\n );\n this._updateStateFn((state) => ({\n ...state,\n deviceStatus: DeviceStatus.LOCKED,\n }));\n }),\n );\n return interval(refreshInterval + 100).pipe(\n switchMap(() => race(nanoSRefreshObservable, timeoutObservable)),\n );\n }\n\n /**\n * Maintain a device status to prevent sending APDU when the device is busy.\n *\n * @param {DeviceStatus} deviceStatus - The new device status.\n */\n setDeviceStatus(deviceStatus: DeviceStatus) {\n if (deviceStatus === DeviceStatus.NOT_CONNECTED) {\n this.stop();\n }\n this._deviceStatus = deviceStatus;\n }\n\n /**\n * Stops the session refresher.\n * The refresher will no longer send commands to refresh the session.\n */\n stop() {\n if (!this._subscription || this._subscription.closed) {\n return;\n }\n this._subscription.unsubscribe();\n this._subscription = undefined;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["injectable", "delay", "filter", "from", "interval", "map", "of", "race", "switchMap", "isSuccessCommandResult", "GetAppAndVersionCommand", "GetOsVersionCommand", "DeviceModelId", "DeviceStatus", "DeviceSessionStateType", "DeviceSessionRefresher", "GetAppAndVersionCommand", "GetOsVersionCommand", "refreshInterval", "deviceStatus", "sendApduFn", "updateStateFn", "deviceModelId", "logger", "refreshObservable", "DeviceModelId", "interval", "parsedResponse", "isSuccessCommandResult", "state", "DeviceSessionStateType", "parentObservable", "from", "filter", "DeviceStatus", "switchMap", "rawApdu", "map", "resp", "error", "data", "nanoSRefreshObservable", "timeoutObservable", "of", "delay", "_", "race", "__decorateClass", "injectable"]
7
7
  }
@@ -1,2 +1,2 @@
1
- var _=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var c=(n,r,t,e)=>{for(var i=e>1?void 0:e?A(r,t):r,a=n.length-1,m;a>=0;a--)(m=n[a])&&(i=(e?m(r,t,i):m(i))||i);return e&&i&&_(r,t,i),i},d=(n,r)=>(t,e)=>r(t,e,n);import{inject as b,injectable as H}from"inversify";import{Left as l,Maybe as s,Right as z}from"purify-ts";import{v4 as y}from"uuid";import{APDU_DATA_LENGTH_LENGTH as p,CHANNEL_LENGTH as u,HEAD_TAG as E,HEAD_TAG_LENGTH as L,INDEX_LENGTH as f}from"../../../api/device-session/data/FramerConst";import{FramerUtils as g}from"../../../api/device-session/utils/FramerUtils";import{FramerApduError as v,FramerOverflowError as F}from"../../device-session/model/Errors";import{Frame as T}from"../../device-session/model/Frame";import{FrameHeader as w}from"../../device-session/model/FrameHeader";import{loggerTypes as N}from"../../logger-publisher/di/loggerTypes";let o=class{_frameSize;_channel;_padding;_logger;constructor({frameSize:r,channel:t=s.zero(),padding:e=!1},i){this._frameSize=r,this._channel=t,this._padding=e,this._logger=i("framer")}getFrames(r){const t=[];let e=0,i=this.getFrameAtIndex(r,e);for(;i.isRight();)t.push(i.extract()),e+=1,i=this.getFrameAtIndex(r,e).mapLeft(a=>(a instanceof F?this._logger.debug("Frames parsed",{data:{count:e}}):this._logger.error("Error while parsing frame",{data:{error:a}}),a));return t}getFrameAtIndex(r,t){const e=this.getFrameHeaderFrom(t,r.length),i=t*this._frameSize-this.getHeaderSizeSumFrom(t);if(i>r.length)return l(new F);if(e.getLength()>this._frameSize)return l(new v);const a=this._frameSize-e.getLength(),m=r.slice(t===0?0:i,t===0?a:i+this._frameSize-e.getLength()),h=this._padding?new Uint8Array(a).fill(0):new Uint8Array(m.length<a?m.length:a);h.set(m,0);const S=new T({header:e,data:h});return z(S)}getFrameHeaderFrom(r,t){const e=new w({uuid:y(),channel:this._channel.map(i=>g.getLastBytesFrom(i,u)),headTag:new Uint8Array([E]),index:g.numberToByteArray(r,f),length:this.getFrameHeaderSizeFromIndex(r),dataSize:s.zero()});return r===0&&e.setDataSize(s.of(g.numberToByteArray(t,p))),e}getHeaderSizeSumFrom(r){let t=this.getFrameHeaderSizeFromIndex(0),e=1;for(;e<r;)t+=this.getFrameHeaderSizeFromIndex(e),e+=1;return t}getFrameHeaderSizeFromIndex(r){return this._channel.caseOf({Just:()=>u,Nothing:()=>0})+f+L+(r===0?p:0)}};o=c([H(),d(1,b(N.LoggerPublisherServiceFactory))],o);export{o as DefaultApduSenderService};
1
+ var A=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var c=(m,r,t,e)=>{for(var i=e>1?void 0:e?_(r,t):r,a=m.length-1,n;a>=0;a--)(n=m[a])&&(i=(e?n(r,t,i):n(i))||i);return e&&i&&A(r,t,i),i},d=(m,r)=>(t,e)=>r(t,e,m);import{inject as b,injectable as H}from"inversify";import{Left as l,Maybe as s,Right as z}from"purify-ts";import{v4 as v}from"uuid";import{APDU_DATA_LENGTH_LENGTH as p,CHANNEL_LENGTH as u,HEAD_TAG as y,HEAD_TAG_LENGTH as E,INDEX_LENGTH as f}from"../../../api/device-session/data/FramerConst";import{FramerUtils as g}from"../../../api/device-session/utils/FramerUtils";import{FramerApduError as L,FramerOverflowError as F}from"../../device-session/model/Errors";import{Frame as T}from"../../device-session/model/Frame";import{FrameHeader as w}from"../../device-session/model/FrameHeader";import{loggerTypes as N}from"../../logger-publisher/di/loggerTypes";let o=class{_frameSize;_channel;_padding;_logger;constructor({frameSize:r,channel:t=s.zero(),padding:e=!1},i){this._frameSize=r,this._channel=t,this._padding=e,this._logger=i("DefaultApduSenderService")}getFrames(r){const t=[];let e=0,i=this.getFrameAtIndex(r,e);for(;i.isRight();)t.push(i.extract()),e+=1,i=this.getFrameAtIndex(r,e).mapLeft(a=>(a instanceof F?this._logger.debug("Frames parsed",{data:{count:e}}):this._logger.error("Error while parsing frame",{data:{error:a}}),a));return t}getFrameAtIndex(r,t){const e=this.getFrameHeaderFrom(t,r.length),i=t*this._frameSize-this.getHeaderSizeSumFrom(t);if(i>r.length)return l(new F);if(e.getLength()>this._frameSize)return l(new L);const a=this._frameSize-e.getLength(),n=r.slice(t===0?0:i,t===0?a:i+this._frameSize-e.getLength()),h=this._padding?new Uint8Array(a).fill(0):new Uint8Array(n.length<a?n.length:a);h.set(n,0);const S=new T({header:e,data:h});return z(S)}getFrameHeaderFrom(r,t){const e=new w({uuid:v(),channel:this._channel.map(i=>g.getLastBytesFrom(i,u)),headTag:new Uint8Array([y]),index:g.numberToByteArray(r,f),length:this.getFrameHeaderSizeFromIndex(r),dataSize:s.zero()});return r===0&&e.setDataSize(s.of(g.numberToByteArray(t,p))),e}getHeaderSizeSumFrom(r){let t=this.getFrameHeaderSizeFromIndex(0),e=1;for(;e<r;)t+=this.getFrameHeaderSizeFromIndex(e),e+=1;return t}getFrameHeaderSizeFromIndex(r){return this._channel.caseOf({Just:()=>u,Nothing:()=>0})+f+E+(r===0?p:0)}};o=c([H(),d(1,b(N.LoggerPublisherServiceFactory))],o);export{o as DefaultApduSenderService};
2
2
  //# sourceMappingURL=DefaultApduSenderService.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/device-session/service/DefaultApduSenderService.ts"],
4
- "sourcesContent": ["import { inject, injectable } from \"inversify\";\nimport { Either, Left, Maybe, Right } from \"purify-ts\";\nimport { v4 } from \"uuid\";\n\nimport {\n APDU_DATA_LENGTH_LENGTH,\n CHANNEL_LENGTH,\n HEAD_TAG,\n HEAD_TAG_LENGTH,\n INDEX_LENGTH,\n} from \"@api/device-session/data/FramerConst\";\nimport type {\n ApduSenderService,\n ApduSenderServiceConstructorArgs,\n} from \"@api/device-session/service/ApduSenderService\";\nimport { FramerUtils } from \"@api/device-session/utils/FramerUtils\";\nimport { LoggerPublisherService } from \"@api/logger-publisher/service/LoggerPublisherService\";\nimport {\n FramerApduError,\n FramerOverflowError,\n} from \"@internal/device-session/model/Errors\";\nimport { Frame } from \"@internal/device-session/model/Frame\";\nimport { FrameHeader } from \"@internal/device-session/model/FrameHeader\";\nimport { loggerTypes } from \"@internal/logger-publisher/di/loggerTypes\";\nimport { DmkError } from \"@root/src/api/Error\";\n/**\n * Default implementation of ApduSenderService\n *\n * Split APDU in an array of frames readies to send to a TransportConnectedDevice\n */\n@injectable()\nexport class DefaultApduSenderService implements ApduSenderService {\n protected _frameSize: number;\n protected _channel: Maybe<Uint8Array>;\n protected _padding: boolean;\n private _logger: LoggerPublisherService;\n\n /**\n * Constructor\n *\n * @param frameSize\n * @param channel\n * @param padding\n * @param loggerServiceFactory\n */\n constructor(\n {\n frameSize,\n channel = Maybe.zero(),\n padding = false,\n }: ApduSenderServiceConstructorArgs,\n @inject(loggerTypes.LoggerPublisherServiceFactory)\n loggerServiceFactory: (tag: string) => LoggerPublisherService,\n ) {\n this._frameSize = frameSize;\n this._channel = channel;\n this._padding = padding;\n this._logger = loggerServiceFactory(\"framer\");\n }\n\n /**\n * Get frames from apdu\n *\n * @param apdu\n */\n public getFrames(apdu: Uint8Array): Frame[] {\n const frames: Frame[] = [];\n let count = 0;\n let frame = this.getFrameAtIndex(apdu, count);\n\n while (frame.isRight()) {\n frames.push(frame.extract());\n count += 1;\n frame = this.getFrameAtIndex(apdu, count).mapLeft((error) => {\n if (error instanceof FramerOverflowError) {\n this._logger.debug(\"Frames parsed\", { data: { count } });\n } else {\n this._logger.error(\"Error while parsing frame\", { data: { error } });\n }\n return error;\n });\n }\n return frames;\n }\n\n /**\n * Get apdu frame at index\n * Split every {{PACKET_SIZE - HEADER_SIZE}} bytes of apdu\n * @param apdu\n * @param frameIndex\n * @private\n */\n private getFrameAtIndex(\n apdu: Uint8Array,\n frameIndex: number,\n ): Either<DmkError, Frame> {\n const header = this.getFrameHeaderFrom(frameIndex, apdu.length);\n const frameOffset =\n frameIndex * this._frameSize - this.getHeaderSizeSumFrom(frameIndex);\n\n if (frameOffset > apdu.length) {\n return Left(new FramerOverflowError());\n }\n if (header.getLength() > this._frameSize) {\n return Left(new FramerApduError());\n }\n const dataMaxSize = this._frameSize - header.getLength();\n const data = apdu.slice(\n frameIndex === 0 ? 0 : frameOffset,\n frameIndex === 0\n ? dataMaxSize\n : frameOffset + this._frameSize - header.getLength(),\n );\n const frameData = this._padding\n ? new Uint8Array(dataMaxSize).fill(0)\n : new Uint8Array(data.length < dataMaxSize ? data.length : dataMaxSize);\n frameData.set(data, 0);\n const frame = new Frame({\n header,\n data: frameData,\n });\n return Right(frame);\n }\n\n /**\n * Get frame header\n * @param frameIndex\n * @param apduSize\n * @private\n */\n private getFrameHeaderFrom(\n frameIndex: number,\n apduSize: number,\n ): FrameHeader {\n const header = new FrameHeader({\n uuid: v4(),\n channel: this._channel.map((channel) =>\n FramerUtils.getLastBytesFrom(channel, CHANNEL_LENGTH),\n ),\n headTag: new Uint8Array([HEAD_TAG]),\n index: FramerUtils.numberToByteArray(frameIndex, INDEX_LENGTH),\n length: this.getFrameHeaderSizeFromIndex(frameIndex),\n dataSize: Maybe.zero(),\n });\n if (frameIndex === 0) {\n header.setDataSize(\n Maybe.of(\n FramerUtils.numberToByteArray(apduSize, APDU_DATA_LENGTH_LENGTH),\n ),\n );\n }\n return header;\n }\n\n /**\n * Get frame offset\n * First frame has more bytes of header\n * Padding append means a 0 bytes is added at the end of each frame\n * @private\n * @param frameIndex\n */\n private getHeaderSizeSumFrom(frameIndex: number): number {\n let sum = this.getFrameHeaderSizeFromIndex(0);\n let i = 1;\n while (i < frameIndex) {\n sum += this.getFrameHeaderSizeFromIndex(i);\n i += 1;\n }\n return sum;\n }\n\n /**\n * Get frame header size\n * @private\n * @param frameIndex\n */\n private getFrameHeaderSizeFromIndex(frameIndex: number): number {\n return (\n this._channel.caseOf({\n Just: () => CHANNEL_LENGTH,\n Nothing: () => 0,\n }) +\n INDEX_LENGTH +\n HEAD_TAG_LENGTH +\n (frameIndex === 0 ? APDU_DATA_LENGTH_LENGTH : 0)\n );\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { inject, injectable } from \"inversify\";\nimport { Either, Left, Maybe, Right } from \"purify-ts\";\nimport { v4 } from \"uuid\";\n\nimport {\n APDU_DATA_LENGTH_LENGTH,\n CHANNEL_LENGTH,\n HEAD_TAG,\n HEAD_TAG_LENGTH,\n INDEX_LENGTH,\n} from \"@api/device-session/data/FramerConst\";\nimport type {\n ApduSenderService,\n ApduSenderServiceConstructorArgs,\n} from \"@api/device-session/service/ApduSenderService\";\nimport { FramerUtils } from \"@api/device-session/utils/FramerUtils\";\nimport { LoggerPublisherService } from \"@api/logger-publisher/service/LoggerPublisherService\";\nimport {\n FramerApduError,\n FramerOverflowError,\n} from \"@internal/device-session/model/Errors\";\nimport { Frame } from \"@internal/device-session/model/Frame\";\nimport { FrameHeader } from \"@internal/device-session/model/FrameHeader\";\nimport { loggerTypes } from \"@internal/logger-publisher/di/loggerTypes\";\nimport { DmkError } from \"@root/src/api/Error\";\n/**\n * Default implementation of ApduSenderService\n *\n * Split APDU in an array of frames readies to send to a TransportConnectedDevice\n */\n@injectable()\nexport class DefaultApduSenderService implements ApduSenderService {\n protected _frameSize: number;\n protected _channel: Maybe<Uint8Array>;\n protected _padding: boolean;\n private _logger: LoggerPublisherService;\n\n /**\n * Constructor\n *\n * @param frameSize\n * @param channel\n * @param padding\n * @param loggerServiceFactory\n */\n constructor(\n {\n frameSize,\n channel = Maybe.zero(),\n padding = false,\n }: ApduSenderServiceConstructorArgs,\n @inject(loggerTypes.LoggerPublisherServiceFactory)\n loggerServiceFactory: (tag: string) => LoggerPublisherService,\n ) {\n this._frameSize = frameSize;\n this._channel = channel;\n this._padding = padding;\n this._logger = loggerServiceFactory(\"DefaultApduSenderService\");\n }\n\n /**\n * Get frames from apdu\n *\n * @param apdu\n */\n public getFrames(apdu: Uint8Array): Frame[] {\n const frames: Frame[] = [];\n let count = 0;\n let frame = this.getFrameAtIndex(apdu, count);\n\n while (frame.isRight()) {\n frames.push(frame.extract());\n count += 1;\n frame = this.getFrameAtIndex(apdu, count).mapLeft((error) => {\n if (error instanceof FramerOverflowError) {\n this._logger.debug(\"Frames parsed\", { data: { count } });\n } else {\n this._logger.error(\"Error while parsing frame\", { data: { error } });\n }\n return error;\n });\n }\n return frames;\n }\n\n /**\n * Get apdu frame at index\n * Split every {{PACKET_SIZE - HEADER_SIZE}} bytes of apdu\n * @param apdu\n * @param frameIndex\n * @private\n */\n private getFrameAtIndex(\n apdu: Uint8Array,\n frameIndex: number,\n ): Either<DmkError, Frame> {\n const header = this.getFrameHeaderFrom(frameIndex, apdu.length);\n const frameOffset =\n frameIndex * this._frameSize - this.getHeaderSizeSumFrom(frameIndex);\n\n if (frameOffset > apdu.length) {\n return Left(new FramerOverflowError());\n }\n if (header.getLength() > this._frameSize) {\n return Left(new FramerApduError());\n }\n const dataMaxSize = this._frameSize - header.getLength();\n const data = apdu.slice(\n frameIndex === 0 ? 0 : frameOffset,\n frameIndex === 0\n ? dataMaxSize\n : frameOffset + this._frameSize - header.getLength(),\n );\n const frameData = this._padding\n ? new Uint8Array(dataMaxSize).fill(0)\n : new Uint8Array(data.length < dataMaxSize ? data.length : dataMaxSize);\n frameData.set(data, 0);\n const frame = new Frame({\n header,\n data: frameData,\n });\n return Right(frame);\n }\n\n /**\n * Get frame header\n * @param frameIndex\n * @param apduSize\n * @private\n */\n private getFrameHeaderFrom(\n frameIndex: number,\n apduSize: number,\n ): FrameHeader {\n const header = new FrameHeader({\n uuid: v4(),\n channel: this._channel.map((channel) =>\n FramerUtils.getLastBytesFrom(channel, CHANNEL_LENGTH),\n ),\n headTag: new Uint8Array([HEAD_TAG]),\n index: FramerUtils.numberToByteArray(frameIndex, INDEX_LENGTH),\n length: this.getFrameHeaderSizeFromIndex(frameIndex),\n dataSize: Maybe.zero(),\n });\n if (frameIndex === 0) {\n header.setDataSize(\n Maybe.of(\n FramerUtils.numberToByteArray(apduSize, APDU_DATA_LENGTH_LENGTH),\n ),\n );\n }\n return header;\n }\n\n /**\n * Get frame offset\n * First frame has more bytes of header\n * Padding append means a 0 bytes is added at the end of each frame\n * @private\n * @param frameIndex\n */\n private getHeaderSizeSumFrom(frameIndex: number): number {\n let sum = this.getFrameHeaderSizeFromIndex(0);\n let i = 1;\n while (i < frameIndex) {\n sum += this.getFrameHeaderSizeFromIndex(i);\n i += 1;\n }\n return sum;\n }\n\n /**\n * Get frame header size\n * @private\n * @param frameIndex\n */\n private getFrameHeaderSizeFromIndex(frameIndex: number): number {\n return (\n this._channel.caseOf({\n Just: () => CHANNEL_LENGTH,\n Nothing: () => 0,\n }) +\n INDEX_LENGTH +\n HEAD_TAG_LENGTH +\n (frameIndex === 0 ? APDU_DATA_LENGTH_LENGTH : 0)\n );\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["inject", "injectable", "Left", "Maybe", "Right", "v4", "APDU_DATA_LENGTH_LENGTH", "CHANNEL_LENGTH", "HEAD_TAG", "HEAD_TAG_LENGTH", "INDEX_LENGTH", "FramerUtils", "FramerApduError", "FramerOverflowError", "Frame", "FrameHeader", "loggerTypes", "DefaultApduSenderService", "frameSize", "channel", "Maybe", "padding", "loggerServiceFactory", "apdu", "frames", "count", "frame", "error", "FramerOverflowError", "frameIndex", "header", "frameOffset", "Left", "FramerApduError", "dataMaxSize", "data", "frameData", "Frame", "Right", "apduSize", "FrameHeader", "v4", "FramerUtils", "CHANNEL_LENGTH", "HEAD_TAG", "INDEX_LENGTH", "APDU_DATA_LENGTH_LENGTH", "sum", "i", "HEAD_TAG_LENGTH", "__decorateClass", "injectable", "__decorateParam", "inject", "loggerTypes"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ import{v4 as t}from"uuid";class h{constructor(e){this._refresher=e}_refresherBlockers=new Set;disableRefresher(e){const r=`${e}-${t()}`;this.addRefresherBlocker(r);let s=!1;return()=>{s||(s=!0,this.removeRefresherBlocker(r))}}addRefresherBlocker(e){const r=this._refresherBlockers.size;this._refresherBlockers.add(e),r===0&&this._refresher.stop()}removeRefresherBlocker(e){const r=this._refresherBlockers.size;this._refresherBlockers.delete(e),r>0&&this._refresherBlockers.size===0&&this._refresher.start()}}export{h as RefresherService};
2
+ //# sourceMappingURL=RefresherService.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/device-session/service/RefresherService.ts"],
4
+ "sourcesContent": ["import { v4 as uuidv4 } from \"uuid\";\n\nimport { type DeviceSessionRefresher } from \"@internal/device-session/model/DeviceSessionRefresher\";\n\nexport class RefresherService {\n // the refresher should be enabled if and only if the size of this is equal to zero\n private readonly _refresherBlockers = new Set<string>();\n\n constructor(private readonly _refresher: DeviceSessionRefresher) {}\n\n public disableRefresher(id: string): () => void {\n const uniqueId = `${id}-${uuidv4()}`;\n this.addRefresherBlocker(uniqueId);\n\n let hasBeenReenabled = false;\n\n return () => {\n if (hasBeenReenabled) return;\n\n hasBeenReenabled = true;\n this.removeRefresherBlocker(uniqueId);\n };\n }\n\n private addRefresherBlocker(blockerId: string) {\n const prevBlockersCount = this._refresherBlockers.size;\n this._refresherBlockers.add(blockerId);\n\n if (prevBlockersCount === 0) {\n this._refresher.stop();\n }\n }\n\n private removeRefresherBlocker(blockerId: string) {\n const prevBlockersCount = this._refresherBlockers.size;\n this._refresherBlockers.delete(blockerId);\n\n if (prevBlockersCount > 0 && this._refresherBlockers.size === 0) {\n this._refresher.start();\n }\n }\n}\n"],
5
+ "mappings": "AAAA,OAAS,MAAMA,MAAc,OAItB,MAAMC,CAAiB,CAI5B,YAA6BC,EAAoC,CAApC,gBAAAA,CAAqC,CAFjD,mBAAqB,IAAI,IAInC,iBAAiBC,EAAwB,CAC9C,MAAMC,EAAW,GAAGD,CAAE,IAAIH,EAAO,CAAC,GAClC,KAAK,oBAAoBI,CAAQ,EAEjC,IAAIC,EAAmB,GAEvB,MAAO,IAAM,CACPA,IAEJA,EAAmB,GACnB,KAAK,uBAAuBD,CAAQ,EACtC,CACF,CAEQ,oBAAoBE,EAAmB,CAC7C,MAAMC,EAAoB,KAAK,mBAAmB,KAClD,KAAK,mBAAmB,IAAID,CAAS,EAEjCC,IAAsB,GACxB,KAAK,WAAW,KAAK,CAEzB,CAEQ,uBAAuBD,EAAmB,CAChD,MAAMC,EAAoB,KAAK,mBAAmB,KAClD,KAAK,mBAAmB,OAAOD,CAAS,EAEpCC,EAAoB,GAAK,KAAK,mBAAmB,OAAS,GAC5D,KAAK,WAAW,MAAM,CAE1B,CACF",
6
+ "names": ["uuidv4", "RefresherService", "_refresher", "id", "uniqueId", "hasBeenReenabled", "blockerId", "prevBlockersCount"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{RefresherService as s}from"./RefresherService";let e;describe("RefresherService",()=>{beforeEach(()=>{e={start:vi.fn(),stop:vi.fn()}}),it("should be created",()=>{const r=new s(e);expect(r).toBeDefined()}),describe("with only 1 blocker",()=>{it("should disable the refresher",()=>{new s(e).disableRefresher("test"),expect(e.stop).toHaveBeenCalled()}),it("should reenable the refresher",()=>{new s(e).disableRefresher("test")(),expect(e.stop).toHaveBeenCalled(),expect(e.start).toHaveBeenCalled()})}),describe("with 2+ blockers",()=>{it("should not disable the refresher a second time",()=>{const r=new s(e);r.disableRefresher("test"),r.disableRefresher("test-2"),expect(e.stop).toHaveBeenCalledTimes(1)}),it("should reenable the refresher when the last blocker is removed",()=>{const r=new s(e),t=r.disableRefresher("test"),o=r.disableRefresher("test-2");expect(e.stop).toHaveBeenCalledTimes(1),t(),expect(e.start).not.toHaveBeenCalled(),o(),expect(e.start).toHaveBeenCalled()})})});
2
+ //# sourceMappingURL=RefresherService.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/device-session/service/RefresherService.test.ts"],
4
+ "sourcesContent": ["import { type DeviceSessionRefresher } from \"@internal/device-session/model/DeviceSessionRefresher\";\n\nimport { RefresherService } from \"./RefresherService\";\n\nlet refresher: DeviceSessionRefresher;\ndescribe(\"RefresherService\", () => {\n beforeEach(() => {\n refresher = {\n start: vi.fn(),\n stop: vi.fn(),\n } as unknown as DeviceSessionRefresher;\n });\n\n it(\"should be created\", () => {\n const refresherService = new RefresherService(refresher);\n expect(refresherService).toBeDefined();\n });\n\n describe(\"with only 1 blocker\", () => {\n it(\"should disable the refresher\", () => {\n const refresherService = new RefresherService(refresher);\n refresherService.disableRefresher(\"test\");\n expect(refresher.stop).toHaveBeenCalled();\n });\n\n it(\"should reenable the refresher\", () => {\n const refresherService = new RefresherService(refresher);\n const reenableRefresher = refresherService.disableRefresher(\"test\");\n reenableRefresher();\n expect(refresher.stop).toHaveBeenCalled();\n expect(refresher.start).toHaveBeenCalled();\n });\n });\n\n describe(\"with 2+ blockers\", () => {\n it(\"should not disable the refresher a second time\", () => {\n const refresherService = new RefresherService(refresher);\n refresherService.disableRefresher(\"test\");\n refresherService.disableRefresher(\"test-2\");\n expect(refresher.stop).toHaveBeenCalledTimes(1);\n });\n\n it(\"should reenable the refresher when the last blocker is removed\", () => {\n const refresherService = new RefresherService(refresher);\n const reenableRefresher1 = refresherService.disableRefresher(\"test\");\n const reenableRefresher2 = refresherService.disableRefresher(\"test-2\");\n expect(refresher.stop).toHaveBeenCalledTimes(1);\n reenableRefresher1();\n expect(refresher.start).not.toHaveBeenCalled();\n reenableRefresher2();\n expect(refresher.start).toHaveBeenCalled();\n });\n });\n});\n"],
5
+ "mappings": "AAEA,OAAS,oBAAAA,MAAwB,qBAEjC,IAAIC,EACJ,SAAS,mBAAoB,IAAM,CACjC,WAAW,IAAM,CACfA,EAAY,CACV,MAAO,GAAG,GAAG,EACb,KAAM,GAAG,GAAG,CACd,CACF,CAAC,EAED,GAAG,oBAAqB,IAAM,CAC5B,MAAMC,EAAmB,IAAIF,EAAiBC,CAAS,EACvD,OAAOC,CAAgB,EAAE,YAAY,CACvC,CAAC,EAED,SAAS,sBAAuB,IAAM,CACpC,GAAG,+BAAgC,IAAM,CACd,IAAIF,EAAiBC,CAAS,EACtC,iBAAiB,MAAM,EACxC,OAAOA,EAAU,IAAI,EAAE,iBAAiB,CAC1C,CAAC,EAED,GAAG,gCAAiC,IAAM,CACf,IAAID,EAAiBC,CAAS,EACZ,iBAAiB,MAAM,EAChD,EAClB,OAAOA,EAAU,IAAI,EAAE,iBAAiB,EACxC,OAAOA,EAAU,KAAK,EAAE,iBAAiB,CAC3C,CAAC,CACH,CAAC,EAED,SAAS,mBAAoB,IAAM,CACjC,GAAG,iDAAkD,IAAM,CACzD,MAAMC,EAAmB,IAAIF,EAAiBC,CAAS,EACvDC,EAAiB,iBAAiB,MAAM,EACxCA,EAAiB,iBAAiB,QAAQ,EAC1C,OAAOD,EAAU,IAAI,EAAE,sBAAsB,CAAC,CAChD,CAAC,EAED,GAAG,iEAAkE,IAAM,CACzE,MAAMC,EAAmB,IAAIF,EAAiBC,CAAS,EACjDE,EAAqBD,EAAiB,iBAAiB,MAAM,EAC7DE,EAAqBF,EAAiB,iBAAiB,QAAQ,EACrE,OAAOD,EAAU,IAAI,EAAE,sBAAsB,CAAC,EAC9CE,EAAmB,EACnB,OAAOF,EAAU,KAAK,EAAE,IAAI,iBAAiB,EAC7CG,EAAmB,EACnB,OAAOH,EAAU,KAAK,EAAE,iBAAiB,CAC3C,CAAC,CACH,CAAC,CACH,CAAC",
6
+ "names": ["RefresherService", "refresher", "refresherService", "reenableRefresher1", "reenableRefresher2"]
7
+ }
@@ -1,2 +1,2 @@
1
- var v=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var a=(p,r,e,o)=>{for(var t=o>1?void 0:o?d(r,e):r,s=p.length-1,n;s>=0;s--)(n=p[s])&&(t=(o?n(r,e,t):n(t))||t);return o&&t&&v(r,e,t),t},m=(p,r)=>(e,o)=>r(e,o,p);import{inject as D,injectable as l}from"inversify";import{from as T,map as c,merge as f,scan as u}from"rxjs";import{DeviceModel as b}from"../../../api/device/DeviceModel";import{transportDiTypes as h}from"../../transport/di/transportDiTypes";let i=class{_transports;constructor(r){this._transports=r.getAllTransports()}mapTransportDiscoveredDeviceToDiscoveredDevice(r){const e=new b({id:r.id,model:r.deviceModel.id,name:r.deviceModel.productName});return{id:r.id,deviceModel:e,transport:r.transport,name:r.name||e.name,rssi:r.rssi}}execute(){if(this._transports.length===0)return T([[]]);const r=this._transports.map((e,o)=>e.listenToAvailableDevices().pipe(c(t=>({index:o,arr:t}))));return f(...r).pipe(u((e,{index:o,arr:t})=>(e[o]=t,e),{}),c(e=>Object.values(e).flat().map(this.mapTransportDiscoveredDeviceToDiscoveredDevice)))}};i=a([l(),m(0,D(h.TransportService))],i);export{i as ListenToAvailableDevicesUseCase};
1
+ var m=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var v=(n,r,t,o)=>{for(var e=o>1?void 0:o?g(r,t):r,i=n.length-1,s;i>=0;i--)(s=n[i])&&(e=(o?s(r,t,e):s(e))||e);return o&&e&&m(r,t,e),e},p=(n,r)=>(t,o)=>r(t,o,n);import{inject as l,injectable as D}from"inversify";import{from as d,map as c,merge as T,of as f,scan as h}from"rxjs";import{DeviceModel as b}from"../../../api/device/DeviceModel";import{loggerTypes as u}from"../../logger-publisher/di/loggerTypes";import{transportDiTypes as _}from"../../transport/di/transportDiTypes";let a=class{_transports;_transportService;_logger;constructor(r,t){this._transports=r.getAllTransports(),this._transportService=r,this._logger=t("ListenToAvailableDevicesUseCase")}mapTransportDiscoveredDeviceToDiscoveredDevice(r){const t=new b({id:r.id,model:r.deviceModel.id,name:r.deviceModel.productName});return{id:r.id,deviceModel:t,transport:r.transport,name:r.name||t.name,rssi:r.rssi}}execute({transport:r}){if(this._logger.info("Listening to available devices"),this._transports.length===0)return this._logger.warn("No transports available"),d([[]]);if(!r){this._logger.info("Discovering all available transports");const o=this._transports.map((e,i)=>e.listenToAvailableDevices().pipe(c(s=>({index:i,arr:s}))));return T(...o).pipe(h((e,{index:i,arr:s})=>(e[i]=s,e),{}),c(e=>Object.values(e).flat().map(this.mapTransportDiscoveredDeviceToDiscoveredDevice)))}return this._logger.info(`Discovering devices on transport ${r}`),this._transportService.getTransport(r).caseOf({Nothing:()=>(this._logger.error(`Transport ${r} not found`),f([])),Just:o=>o.listenToAvailableDevices().pipe(c(e=>e.map(this.mapTransportDiscoveredDeviceToDiscoveredDevice)))})}};a=v([D(),p(0,l(_.TransportService)),p(1,l(u.LoggerPublisherServiceFactory))],a);export{a as ListenToAvailableDevicesUseCase};
2
2
  //# sourceMappingURL=ListenToAvailableDevicesUseCase.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/discovery/use-case/ListenToAvailableDevicesUseCase.ts"],
4
- "sourcesContent": ["import { inject, injectable } from \"inversify\";\nimport { from, map, merge, Observable, scan } from \"rxjs\";\n\nimport { DeviceModel } from \"@api/device/DeviceModel\";\nimport type { Transport } from \"@api/transport/model/Transport\";\nimport { TransportDiscoveredDevice } from \"@api/transport/model/TransportDiscoveredDevice\";\nimport { DiscoveredDevice } from \"@api/types\";\nimport { transportDiTypes } from \"@internal/transport/di/transportDiTypes\";\nimport { type TransportService } from \"@internal/transport/service/TransportService\";\n\n/**\n * Listen to list of known discovered devices (and later BLE).\n */\n@injectable()\nexport class ListenToAvailableDevicesUseCase {\n private readonly _transports: Transport[];\n constructor(\n @inject(transportDiTypes.TransportService)\n transportService: TransportService,\n ) {\n this._transports = transportService.getAllTransports();\n }\n\n private mapTransportDiscoveredDeviceToDiscoveredDevice(\n discoveredDevice: TransportDiscoveredDevice,\n ): DiscoveredDevice {\n const deviceModel = new DeviceModel({\n id: discoveredDevice.id,\n model: discoveredDevice.deviceModel.id,\n name: discoveredDevice.deviceModel.productName,\n });\n return {\n id: discoveredDevice.id,\n deviceModel,\n transport: discoveredDevice.transport,\n name: discoveredDevice.name || deviceModel.name,\n rssi: discoveredDevice.rssi,\n };\n }\n\n execute(): Observable<DiscoveredDevice[]> {\n if (this._transports.length === 0) {\n return from([[]]);\n }\n\n /**\n * Note: we're not using combineLatest because combineLatest will\n * - wait for all observables to emit at least once before emitting.\n * - complete as soon as one of the observables completes.\n * Some transports will just return an empty array and complete.\n * We want to keep listening to all transports until all have completed.\n */\n\n const observablesWithIndex = this._transports.map((transport, index) =>\n transport.listenToAvailableDevices().pipe(\n map((arr) => ({\n index,\n arr,\n })),\n ),\n );\n\n return merge(...observablesWithIndex).pipe(\n scan<\n { index: number; arr: TransportDiscoveredDevice[] },\n { [key: number]: TransportDiscoveredDevice[] }\n >((acc, { index, arr }) => {\n acc[index] = arr;\n return acc;\n }, {}),\n map((acc) =>\n Object.values(acc)\n .flat()\n .map(this.mapTransportDiscoveredDeviceToDiscoveredDevice),\n ),\n );\n }\n}\n"],
5
- "mappings": "iOAAA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YACnC,OAAS,QAAAC,EAAM,OAAAC,EAAK,SAAAC,EAAmB,QAAAC,MAAY,OAEnD,OAAS,eAAAC,MAAmB,0BAI5B,OAAS,oBAAAC,MAAwB,0CAO1B,IAAMC,EAAN,KAAsC,CAC1B,YACjB,YAEEC,EACA,CACA,KAAK,YAAcA,EAAiB,iBAAiB,CACvD,CAEQ,+CACNC,EACkB,CAClB,MAAMC,EAAc,IAAIC,EAAY,CAClC,GAAIF,EAAiB,GACrB,MAAOA,EAAiB,YAAY,GACpC,KAAMA,EAAiB,YAAY,WACrC,CAAC,EACD,MAAO,CACL,GAAIA,EAAiB,GACrB,YAAAC,EACA,UAAWD,EAAiB,UAC5B,KAAMA,EAAiB,MAAQC,EAAY,KAC3C,KAAMD,EAAiB,IACzB,CACF,CAEA,SAA0C,CACxC,GAAI,KAAK,YAAY,SAAW,EAC9B,OAAOG,EAAK,CAAC,CAAC,CAAC,CAAC,EAWlB,MAAMC,EAAuB,KAAK,YAAY,IAAI,CAACC,EAAWC,IAC5DD,EAAU,yBAAyB,EAAE,KACnCE,EAAKC,IAAS,CACZ,MAAAF,EACA,IAAAE,CACF,EAAE,CACJ,CACF,EAEA,OAAOC,EAAM,GAAGL,CAAoB,EAAE,KACpCM,EAGE,CAACC,EAAK,CAAE,MAAAL,EAAO,IAAAE,CAAI,KACnBG,EAAIL,CAAK,EAAIE,EACNG,GACN,CAAC,CAAC,EACLJ,EAAKI,GACH,OAAO,OAAOA,CAAG,EACd,KAAK,EACL,IAAI,KAAK,8CAA8C,CAC5D,CACF,CACF,CACF,EA/Dab,EAANc,EAAA,CADNC,EAAW,EAIPC,EAAA,EAAAC,EAAOC,EAAiB,gBAAgB,IAHhClB",
6
- "names": ["inject", "injectable", "from", "map", "merge", "scan", "DeviceModel", "transportDiTypes", "ListenToAvailableDevicesUseCase", "transportService", "discoveredDevice", "deviceModel", "DeviceModel", "from", "observablesWithIndex", "transport", "index", "map", "arr", "merge", "scan", "acc", "__decorateClass", "injectable", "__decorateParam", "inject", "transportDiTypes"]
4
+ "sourcesContent": ["import { inject, injectable } from \"inversify\";\nimport { from, map, merge, Observable, of, scan } from \"rxjs\";\n\nimport { DeviceModel } from \"@api/device/DeviceModel\";\nimport { LoggerPublisherService } from \"@api/logger-publisher/service/LoggerPublisherService\";\nimport { DiscoveredDevice } from \"@api/transport/model/DiscoveredDevice\";\nimport { type Transport } from \"@api/transport/model/Transport\";\nimport { type TransportDiscoveredDevice } from \"@api/transport/model/TransportDiscoveredDevice\";\nimport { type TransportIdentifier } from \"@api/transport/model/TransportIdentifier\";\nimport { loggerTypes } from \"@internal/logger-publisher/di/loggerTypes\";\nimport { transportDiTypes } from \"@internal/transport/di/transportDiTypes\";\nimport { type TransportService } from \"@internal/transport/service/TransportService\";\n\nexport type ListenToAvailableDevicesUseCaseArgs = {\n /**\n * Identifier of the transport to start discovering devices.\n * Can be undefined to discover all available transports in parallel.\n */\n transport?: TransportIdentifier;\n};\n\n/**\n * Listen to list of known discovered devices (and later BLE).\n */\n@injectable()\nexport class ListenToAvailableDevicesUseCase {\n private readonly _transports: Transport[];\n private readonly _transportService: TransportService;\n private readonly _logger: LoggerPublisherService;\n constructor(\n @inject(transportDiTypes.TransportService)\n transportService: TransportService,\n @inject(loggerTypes.LoggerPublisherServiceFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this._transports = transportService.getAllTransports();\n this._transportService = transportService;\n this._logger = loggerFactory(\"ListenToAvailableDevicesUseCase\");\n }\n\n private mapTransportDiscoveredDeviceToDiscoveredDevice(\n discoveredDevice: TransportDiscoveredDevice,\n ): DiscoveredDevice {\n const deviceModel = new DeviceModel({\n id: discoveredDevice.id,\n model: discoveredDevice.deviceModel.id,\n name: discoveredDevice.deviceModel.productName,\n });\n return {\n id: discoveredDevice.id,\n deviceModel,\n transport: discoveredDevice.transport,\n name: discoveredDevice.name || deviceModel.name,\n rssi: discoveredDevice.rssi,\n };\n }\n\n execute({\n transport,\n }: ListenToAvailableDevicesUseCaseArgs): Observable<DiscoveredDevice[]> {\n this._logger.info(\"Listening to available devices\");\n\n if (this._transports.length === 0) {\n this._logger.warn(\"No transports available\");\n return from([[]]);\n }\n\n if (!transport) {\n this._logger.info(\"Discovering all available transports\");\n /**\n * Note: we're not using combineLatest because combineLatest will\n * - wait for all observables to emit at least once before emitting.\n * - complete as soon as one of the observables completes.\n * Some transports will just return an empty array and complete.\n * We want to keep listening to all transports until all have completed.\n */\n\n const observablesWithIndex = this._transports.map((t, index) =>\n t.listenToAvailableDevices().pipe(\n map((arr) => ({\n index,\n arr,\n })),\n ),\n );\n\n return merge(...observablesWithIndex).pipe(\n scan<\n { index: number; arr: TransportDiscoveredDevice[] },\n { [key: number]: TransportDiscoveredDevice[] }\n >((acc, { index, arr }) => {\n acc[index] = arr;\n return acc;\n }, {}),\n map((acc) =>\n Object.values(acc)\n .flat()\n .map(this.mapTransportDiscoveredDeviceToDiscoveredDevice),\n ),\n );\n }\n\n this._logger.info(`Discovering devices on transport ${transport}`);\n\n const instance = this._transportService.getTransport(transport);\n\n return instance.caseOf({\n Nothing: () => {\n this._logger.error(`Transport ${transport} not found`);\n return of([]);\n },\n Just: (t) => {\n return t\n .listenToAvailableDevices()\n .pipe(\n map((devices) =>\n devices.map(this.mapTransportDiscoveredDeviceToDiscoveredDevice),\n ),\n );\n },\n });\n }\n}\n"],
5
+ "mappings": "iOAAA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YACnC,OAAS,QAAAC,EAAM,OAAAC,EAAK,SAAAC,EAAmB,MAAAC,EAAI,QAAAC,MAAY,OAEvD,OAAS,eAAAC,MAAmB,0BAM5B,OAAS,eAAAC,MAAmB,4CAC5B,OAAS,oBAAAC,MAAwB,0CAe1B,IAAMC,EAAN,KAAsC,CAC1B,YACA,kBACA,QACjB,YAEEC,EAEAC,EACA,CACA,KAAK,YAAcD,EAAiB,iBAAiB,EACrD,KAAK,kBAAoBA,EACzB,KAAK,QAAUC,EAAc,iCAAiC,CAChE,CAEQ,+CACNC,EACkB,CAClB,MAAMC,EAAc,IAAIC,EAAY,CAClC,GAAIF,EAAiB,GACrB,MAAOA,EAAiB,YAAY,GACpC,KAAMA,EAAiB,YAAY,WACrC,CAAC,EACD,MAAO,CACL,GAAIA,EAAiB,GACrB,YAAAC,EACA,UAAWD,EAAiB,UAC5B,KAAMA,EAAiB,MAAQC,EAAY,KAC3C,KAAMD,EAAiB,IACzB,CACF,CAEA,QAAQ,CACN,UAAAG,CACF,EAAwE,CAGtE,GAFA,KAAK,QAAQ,KAAK,gCAAgC,EAE9C,KAAK,YAAY,SAAW,EAC9B,YAAK,QAAQ,KAAK,yBAAyB,EACpCC,EAAK,CAAC,CAAC,CAAC,CAAC,EAGlB,GAAI,CAACD,EAAW,CACd,KAAK,QAAQ,KAAK,sCAAsC,EASxD,MAAME,EAAuB,KAAK,YAAY,IAAI,CAACC,EAAGC,IACpDD,EAAE,yBAAyB,EAAE,KAC3BE,EAAKC,IAAS,CACZ,MAAAF,EACA,IAAAE,CACF,EAAE,CACJ,CACF,EAEA,OAAOC,EAAM,GAAGL,CAAoB,EAAE,KACpCM,EAGE,CAACC,EAAK,CAAE,MAAAL,EAAO,IAAAE,CAAI,KACnBG,EAAIL,CAAK,EAAIE,EACNG,GACN,CAAC,CAAC,EACLJ,EAAKI,GACH,OAAO,OAAOA,CAAG,EACd,KAAK,EACL,IAAI,KAAK,8CAA8C,CAC5D,CACF,CACF,CAEA,YAAK,QAAQ,KAAK,oCAAoCT,CAAS,EAAE,EAEhD,KAAK,kBAAkB,aAAaA,CAAS,EAE9C,OAAO,CACrB,QAAS,KACP,KAAK,QAAQ,MAAM,aAAaA,CAAS,YAAY,EAC9CU,EAAG,CAAC,CAAC,GAEd,KAAOP,GACEA,EACJ,yBAAyB,EACzB,KACCE,EAAKM,GACHA,EAAQ,IAAI,KAAK,8CAA8C,CACjE,CACF,CAEN,CAAC,CACH,CACF,EAjGajB,EAANkB,EAAA,CADNC,EAAW,EAMPC,EAAA,EAAAC,EAAOC,EAAiB,gBAAgB,GAExCF,EAAA,EAAAC,EAAOE,EAAY,6BAA6B,IAPxCvB",
6
+ "names": ["inject", "injectable", "from", "map", "merge", "of", "scan", "DeviceModel", "loggerTypes", "transportDiTypes", "ListenToAvailableDevicesUseCase", "transportService", "loggerFactory", "discoveredDevice", "deviceModel", "DeviceModel", "transport", "from", "observablesWithIndex", "t", "index", "map", "arr", "merge", "scan", "acc", "of", "devices", "__decorateClass", "injectable", "__decorateParam", "inject", "transportDiTypes", "loggerTypes"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{Subject as u}from"rxjs";import{DeviceModel as f}from"../../../api/device/DeviceModel";import{deviceModelStubBuilder as A}from"../../../api/device-model/model/DeviceModel.stub";import{DefaultTransportService as b}from"../../transport/service/DefaultTransportService";import{ListenToAvailableDevicesUseCase as v}from"./ListenToAvailableDevicesUseCase";vi.mock("@internal/transport/service/DefaultTransportService");let i;function m(e){return{listenToAvailableDevices:vi.fn(),connect:vi.fn(),disconnect:vi.fn(),startDiscovering:vi.fn(),stopDiscovering:vi.fn(),getIdentifier:vi.fn(),isSupported:vi.fn(),...e}}const l=A();function n(e){return new f({id:e,model:l.id,name:l.productName})}function p(){const e=new u,r=new u,o=m({listenToAvailableDevices:()=>e.asObservable()}),s=m({listenToAvailableDevices:()=>r.asObservable()});return{transportAKnownDevicesSubject:e,transportBKnownDevicesSubject:r,transportA:o,transportB:s}}function c(e){return{id:e,deviceModel:l,transport:"mock"}}describe("ListenToKnownDevicesUseCase",()=>{beforeEach(()=>{vi.clearAllMocks(),i=new b}),describe("when no transports are available",()=>{it("should return no discovered devices",()=>new Promise((e,r)=>{vi.spyOn(i,"getAllTransports").mockReturnValue([]);const o=new v(i),s=[];o.execute().subscribe({next:t=>{s.push(t)},complete:()=>{try{expect(s).toEqual([[]]),e()}catch(t){r(t)}},error:t=>{r(t)}})}))}),describe("when one transport is available",()=>{it("should return discovered devices from one transport",()=>{const{transportA:e,transportAKnownDevicesSubject:r}=p();vi.spyOn(i,"getAllTransports").mockReturnValue([e]);const o=[];new v(i).execute().subscribe(s=>{o.push(s)}),r.next([c("transportA-device1")]),expect(o[0]).toEqual([{id:"transportA-device1",deviceModel:n("transportA-device1"),name:"Ledger Nano X",transport:"mock",rssi:void 0}]),r.next([c("transportA-device1"),c("transportA-device2")]),expect(o[1]).toEqual([{id:"transportA-device1",deviceModel:n("transportA-device1"),transport:"mock",name:"Ledger Nano X",rssi:void 0},{id:"transportA-device2",deviceModel:n("transportA-device2"),transport:"mock",name:"Ledger Nano X",rssi:void 0}]),r.next([c("transportA-device2")]),expect(o[2]).toEqual([{id:"transportA-device2",deviceModel:n("transportA-device2"),transport:"mock",name:"Ledger Nano X",rssi:void 0}]),r.next([]),expect(o[3]).toEqual([])})}),describe("when multiple transports are available",()=>{it("should return discovered devices from one of the transports as soon as it emits",()=>{const{transportAKnownDevicesSubject:e,transportA:r,transportB:o}=p();vi.spyOn(i,"getAllTransports").mockReturnValue([r,o]);const s=[],t=vi.fn(),a=vi.fn();new v(i).execute().subscribe({next:d=>{s.push(d)},error:t,complete:a}),e.next([c("transportA-device1")]),expect(s[0]).toEqual([{id:"transportA-device1",deviceModel:n("transportA-device1"),transport:"mock",name:"Ledger Nano X",rssi:void 0}]),e.complete(),expect(t).not.toHaveBeenCalled(),expect(a).not.toHaveBeenCalled()}),it("should combine discovered devices from multiple transports",()=>{const{transportAKnownDevicesSubject:e,transportBKnownDevicesSubject:r,transportA:o,transportB:s}=p(),t=[];vi.spyOn(i,"getAllTransports").mockReturnValue([o,s]);const a=vi.fn(),d=vi.fn();new v(i).execute().subscribe({next:D=>{t.push(D)},error:a,complete:d}),e.next([c("transportA-device1")]),expect(t[0]).toEqual([{id:"transportA-device1",deviceModel:n("transportA-device1"),transport:"mock",name:"Ledger Nano X",rssi:void 0}]),r.next([c("transportB-device1")]),expect(t[1]).toEqual([{id:"transportA-device1",deviceModel:n("transportA-device1"),transport:"mock",name:"Ledger Nano X",rssi:void 0},{id:"transportB-device1",deviceModel:n("transportB-device1"),transport:"mock",name:"Ledger Nano X",rssi:void 0}]),r.next([c("transportB-device1"),c("transportB-device2")]),expect(t[2]).toEqual([{id:"transportA-device1",deviceModel:n("transportA-device1"),transport:"mock",name:"Ledger Nano X",rssi:void 0},{id:"transportB-device1",deviceModel:n("transportB-device1"),transport:"mock",name:"Ledger Nano X",rssi:void 0},{id:"transportB-device2",deviceModel:n("transportB-device2"),transport:"mock",name:"Ledger Nano X",rssi:void 0}]),e.next([]),expect(t[3]).toEqual([{id:"transportB-device1",deviceModel:n("transportB-device1"),transport:"mock",name:"Ledger Nano X",rssi:void 0},{id:"transportB-device2",deviceModel:n("transportB-device2"),transport:"mock",name:"Ledger Nano X",rssi:void 0}]),e.complete(),expect(a).not.toHaveBeenCalled(),expect(d).not.toHaveBeenCalled(),r.next([]),expect(t[4]).toEqual([]),r.complete(),expect(a).not.toHaveBeenCalled(),expect(d).toHaveBeenCalled()})})});
1
+ import{Just as A}from"purify-ts";import{Subject as f}from"rxjs";import{DeviceModel as b}from"../../../api/device/DeviceModel";import{deviceModelStubBuilder as g}from"../../../api/device-model/model/DeviceModel.stub";import{DefaultLoggerPublisherService as B}from"../../logger-publisher/service/DefaultLoggerPublisherService";import{DefaultTransportService as k}from"../../transport/service/DefaultTransportService";import{ListenToAvailableDevicesUseCase as l}from"./ListenToAvailableDevicesUseCase";vi.mock("@internal/transport/service/DefaultTransportService");let c,p;function D(e){return{listenToAvailableDevices:vi.fn(),connect:vi.fn(),disconnect:vi.fn(),startDiscovering:vi.fn(),stopDiscovering:vi.fn(),getIdentifier:vi.fn(),isSupported:vi.fn(),...e}}const m=g();function n(e){return new b({id:e,model:m.id,name:m.productName})}function u(){const e=new f,t=new f,o=D({listenToAvailableDevices:()=>e.asObservable(),getIdentifier:()=>"mock-A"}),s=D({listenToAvailableDevices:()=>t.asObservable(),getIdentifier:()=>"mock-B"});return{transportAKnownDevicesSubject:e,transportBKnownDevicesSubject:t,transportA:o,transportB:s}}function a(e){return{id:e,deviceModel:m,transport:"mock"}}describe("ListenToAvailableDevicesUseCase",()=>{beforeEach(()=>{vi.clearAllMocks(),c=new k,p=new B([],"listen-to-available-devices-use-case-test")}),describe("when no transports are available",()=>{it("should return no discovered devices",()=>new Promise((e,t)=>{vi.spyOn(c,"getAllTransports").mockReturnValue([]);const o=new l(c,()=>p),s=[];o.execute({}).subscribe({next:r=>{s.push(r)},complete:()=>{try{expect(s).toEqual([[]]),e()}catch(r){t(r)}},error:r=>{t(r)}})}))}),describe("when one transport is available",()=>{it("should return discovered devices from one transport",()=>{const{transportA:e,transportAKnownDevicesSubject:t}=u();vi.spyOn(c,"getAllTransports").mockReturnValue([e]);const o=[];new l(c,()=>p).execute({}).subscribe(s=>{o.push(s)}),t.next([a("transportA-device1")]),expect(o[0]).toEqual([{id:"transportA-device1",deviceModel:n("transportA-device1"),name:"Ledger Nano X",transport:"mock",rssi:void 0}]),t.next([a("transportA-device1"),a("transportA-device2")]),expect(o[1]).toEqual([{id:"transportA-device1",deviceModel:n("transportA-device1"),transport:"mock",name:"Ledger Nano X",rssi:void 0},{id:"transportA-device2",deviceModel:n("transportA-device2"),transport:"mock",name:"Ledger Nano X",rssi:void 0}]),t.next([a("transportA-device2")]),expect(o[2]).toEqual([{id:"transportA-device2",deviceModel:n("transportA-device2"),transport:"mock",name:"Ledger Nano X",rssi:void 0}]),t.next([]),expect(o[3]).toEqual([])})}),describe("when multiple transports are available",()=>{it("should return discovered devices from one of the transports as soon as it emits",()=>{const{transportAKnownDevicesSubject:e,transportA:t,transportB:o}=u();vi.spyOn(c,"getAllTransports").mockReturnValue([t,o]);const s=[],r=vi.fn(),i=vi.fn();new l(c,()=>p).execute({}).subscribe({next:d=>{s.push(d)},error:r,complete:i}),e.next([a("transportA-device1")]),expect(s[0]).toEqual([{id:"transportA-device1",deviceModel:n("transportA-device1"),transport:"mock",name:"Ledger Nano X",rssi:void 0}]),e.complete(),expect(r).not.toHaveBeenCalled(),expect(i).not.toHaveBeenCalled()}),it("should combine discovered devices from multiple transports",()=>{const{transportAKnownDevicesSubject:e,transportBKnownDevicesSubject:t,transportA:o,transportB:s}=u(),r=[];vi.spyOn(c,"getAllTransports").mockReturnValue([o,s]);const i=vi.fn(),d=vi.fn();new l(c,()=>p).execute({}).subscribe({next:v=>{r.push(v)},error:i,complete:d}),e.next([a("transportA-device1")]),expect(r[0]).toEqual([{id:"transportA-device1",deviceModel:n("transportA-device1"),transport:"mock",name:"Ledger Nano X",rssi:void 0}]),t.next([a("transportB-device1")]),expect(r[1]).toEqual([{id:"transportA-device1",deviceModel:n("transportA-device1"),transport:"mock",name:"Ledger Nano X",rssi:void 0},{id:"transportB-device1",deviceModel:n("transportB-device1"),transport:"mock",name:"Ledger Nano X",rssi:void 0}]),t.next([a("transportB-device1"),a("transportB-device2")]),expect(r[2]).toEqual([{id:"transportA-device1",deviceModel:n("transportA-device1"),transport:"mock",name:"Ledger Nano X",rssi:void 0},{id:"transportB-device1",deviceModel:n("transportB-device1"),transport:"mock",name:"Ledger Nano X",rssi:void 0},{id:"transportB-device2",deviceModel:n("transportB-device2"),transport:"mock",name:"Ledger Nano X",rssi:void 0}]),e.next([]),expect(r[3]).toEqual([{id:"transportB-device1",deviceModel:n("transportB-device1"),transport:"mock",name:"Ledger Nano X",rssi:void 0},{id:"transportB-device2",deviceModel:n("transportB-device2"),transport:"mock",name:"Ledger Nano X",rssi:void 0}]),e.complete(),expect(i).not.toHaveBeenCalled(),expect(d).not.toHaveBeenCalled(),t.next([]),expect(r[4]).toEqual([]),t.complete(),expect(i).not.toHaveBeenCalled(),expect(d).toHaveBeenCalled()}),it("should filter out the devices by transport",()=>{const{transportAKnownDevicesSubject:e,transportBKnownDevicesSubject:t,transportA:o,transportB:s}=u(),r=vi.spyOn(c,"getAllTransports").mockReturnValue([o,s]);vi.spyOn(c,"getTransport").mockReturnValue(A(o));const i=[],d=vi.fn(),v=vi.fn();new l(c,()=>p).execute({transport:"mock-A"}).subscribe({next:x=>{i.push(x)},error:d,complete:v}),expect(r).toBeCalledTimes(1),expect(c.getTransport).toBeCalledWith("mock-A"),e.next([a("transportA-device1")]),expect(i[0]).toEqual([{id:"transportA-device1",deviceModel:n("transportA-device1"),transport:"mock",name:"Ledger Nano X",rssi:void 0}]),t.next([a("transportB-device1")]),expect(i.length).toEqual(1),t.next([a("transportB-device1"),a("transportB-device2")]),expect(i.length).toEqual(1),e.next([]),expect(i[0]).toEqual([{id:"transportA-device1",deviceModel:n("transportA-device1"),transport:"mock",name:"Ledger Nano X",rssi:void 0}]),e.complete(),expect(d).not.toHaveBeenCalled(),expect(v).toHaveBeenCalledOnce(),t.next([]),expect(i[1]).toEqual([]),t.complete(),expect(d).not.toHaveBeenCalled(),expect(v).toHaveBeenCalledOnce()})})});
2
2
  //# sourceMappingURL=ListenToAvailableDevicesUseCase.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/discovery/use-case/ListenToAvailableDevicesUseCase.test.ts"],
4
- "sourcesContent": ["import { Subject } from \"rxjs\";\n\nimport { type DeviceId, DeviceModel } from \"@api/device/DeviceModel\";\nimport { deviceModelStubBuilder } from \"@api/device-model/model/DeviceModel.stub\";\nimport { type TransportDiscoveredDevice } from \"@api/transport/model/TransportDiscoveredDevice\";\nimport { type DiscoveredDevice, type Transport } from \"@api/types\";\nimport { DefaultTransportService } from \"@internal/transport/service/DefaultTransportService\";\nimport { type TransportService } from \"@internal/transport/service/TransportService\";\n\nimport { ListenToAvailableDevicesUseCase } from \"./ListenToAvailableDevicesUseCase\";\n\nvi.mock(\"@internal/transport/service/DefaultTransportService\");\n\nlet transportService: TransportService;\nfunction makeMockTransport(props: Partial<Transport>): Transport {\n return {\n listenToAvailableDevices: vi.fn(),\n connect: vi.fn(),\n disconnect: vi.fn(),\n startDiscovering: vi.fn(),\n stopDiscovering: vi.fn(),\n getIdentifier: vi.fn(),\n isSupported: vi.fn(),\n ...props,\n };\n}\n\nconst mockInternalDeviceModel = deviceModelStubBuilder();\nfunction makeMockDeviceModel(id: DeviceId): DeviceModel {\n return new DeviceModel({\n id,\n model: mockInternalDeviceModel.id,\n name: mockInternalDeviceModel.productName,\n });\n}\n\nfunction setup2MockTransports() {\n const transportAKnownDevicesSubject = new Subject<\n TransportDiscoveredDevice[]\n >();\n const transportBKnownDevicesSubject = new Subject<\n TransportDiscoveredDevice[]\n >();\n const transportA = makeMockTransport({\n listenToAvailableDevices: () =>\n transportAKnownDevicesSubject.asObservable(),\n });\n const transportB = makeMockTransport({\n listenToAvailableDevices: () =>\n transportBKnownDevicesSubject.asObservable(),\n });\n return {\n transportAKnownDevicesSubject,\n transportBKnownDevicesSubject,\n transportA,\n transportB,\n };\n}\n\nfunction makeMockTransportDiscoveredDevice(\n id: string,\n): TransportDiscoveredDevice {\n return {\n id,\n deviceModel: mockInternalDeviceModel,\n transport: \"mock\",\n };\n}\n\ndescribe(\"ListenToKnownDevicesUseCase\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n // @ts-expect-error mock\n transportService = new DefaultTransportService();\n });\n\n describe(\"when no transports are available\", () => {\n it(\"should return no discovered devices\", () =>\n new Promise<void>((resolve, reject) => {\n vi.spyOn(transportService, \"getAllTransports\").mockReturnValue([]);\n\n const useCase = new ListenToAvailableDevicesUseCase(transportService);\n\n const observedDiscoveredDevices: DiscoveredDevice[][] = [];\n useCase.execute().subscribe({\n next: (devices) => {\n observedDiscoveredDevices.push(devices);\n },\n complete: () => {\n try {\n expect(observedDiscoveredDevices).toEqual([[]]);\n resolve();\n } catch (error) {\n reject(error as Error);\n }\n },\n error: (error) => {\n reject(error);\n },\n });\n }));\n });\n\n describe(\"when one transport is available\", () => {\n it(\"should return discovered devices from one transport\", () => {\n const { transportA, transportAKnownDevicesSubject } =\n setup2MockTransports();\n\n vi.spyOn(transportService, \"getAllTransports\").mockReturnValue([\n transportA,\n ]);\n\n const observedDiscoveredDevices: DiscoveredDevice[][] = [];\n new ListenToAvailableDevicesUseCase(transportService)\n .execute()\n .subscribe((devices) => {\n observedDiscoveredDevices.push(devices);\n });\n\n // When transportA emits 1 known device\n transportAKnownDevicesSubject.next([\n makeMockTransportDiscoveredDevice(\"transportA-device1\"),\n ]);\n\n expect(observedDiscoveredDevices[0]).toEqual([\n {\n id: \"transportA-device1\",\n deviceModel: makeMockDeviceModel(\"transportA-device1\"),\n name: \"Ledger Nano X\",\n transport: \"mock\",\n rssi: undefined,\n },\n ]);\n\n // When transportA emits 2 known devices\n transportAKnownDevicesSubject.next([\n makeMockTransportDiscoveredDevice(\"transportA-device1\"),\n makeMockTransportDiscoveredDevice(\"transportA-device2\"),\n ]);\n\n expect(observedDiscoveredDevices[1]).toEqual([\n {\n id: \"transportA-device1\",\n deviceModel: makeMockDeviceModel(\"transportA-device1\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n {\n id: \"transportA-device2\",\n deviceModel: makeMockDeviceModel(\"transportA-device2\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n ]);\n\n // When transportA emits 1 known device (device1 disconnects)\n transportAKnownDevicesSubject.next([\n makeMockTransportDiscoveredDevice(\"transportA-device2\"),\n ]);\n\n expect(observedDiscoveredDevices[2]).toEqual([\n {\n id: \"transportA-device2\",\n deviceModel: makeMockDeviceModel(\"transportA-device2\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n ]);\n\n // When transportA emits 0 known devices (device2 disconnects)\n transportAKnownDevicesSubject.next([]);\n\n expect(observedDiscoveredDevices[3]).toEqual([]);\n });\n });\n\n describe(\"when multiple transports are available\", () => {\n it(\"should return discovered devices from one of the transports as soon as it emits\", () => {\n const { transportAKnownDevicesSubject, transportA, transportB } =\n setup2MockTransports();\n\n vi.spyOn(transportService, \"getAllTransports\").mockReturnValue([\n transportA,\n transportB,\n ]);\n\n const observedDiscoveredDevices: DiscoveredDevice[][] = [];\n\n const onError = vi.fn();\n const onComplete = vi.fn();\n\n new ListenToAvailableDevicesUseCase(transportService)\n .execute()\n .subscribe({\n next: (devices) => {\n observedDiscoveredDevices.push(devices);\n },\n error: onError,\n complete: onComplete,\n });\n\n // When transportA emits 1 known device\n transportAKnownDevicesSubject.next([\n makeMockTransportDiscoveredDevice(\"transportA-device1\"),\n ]);\n\n expect(observedDiscoveredDevices[0]).toEqual([\n {\n id: \"transportA-device1\",\n deviceModel: makeMockDeviceModel(\"transportA-device1\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n ]);\n\n // When transport A listen observable completes\n transportAKnownDevicesSubject.complete();\n\n expect(onError).not.toHaveBeenCalled();\n expect(onComplete).not.toHaveBeenCalled(); // Should not complete yet because transportB has not completed\n });\n\n it(\"should combine discovered devices from multiple transports\", () => {\n const {\n transportAKnownDevicesSubject,\n transportBKnownDevicesSubject,\n transportA,\n transportB,\n } = setup2MockTransports();\n\n const observedDiscoveredDevices: DiscoveredDevice[][] = [];\n\n vi.spyOn(transportService, \"getAllTransports\").mockReturnValue([\n transportA,\n transportB,\n ]);\n\n const onError = vi.fn();\n const onComplete = vi.fn();\n new ListenToAvailableDevicesUseCase(transportService)\n .execute()\n .subscribe({\n next: (devices) => {\n observedDiscoveredDevices.push(devices);\n },\n error: onError,\n complete: onComplete,\n });\n\n // When transportA emits 1 known device\n transportAKnownDevicesSubject.next([\n makeMockTransportDiscoveredDevice(\"transportA-device1\"),\n ]);\n\n expect(observedDiscoveredDevices[0]).toEqual([\n {\n id: \"transportA-device1\",\n deviceModel: makeMockDeviceModel(\"transportA-device1\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n ]);\n\n // When transportB emits 1 known device\n transportBKnownDevicesSubject.next([\n makeMockTransportDiscoveredDevice(\"transportB-device1\"),\n ]);\n\n expect(observedDiscoveredDevices[1]).toEqual([\n {\n id: \"transportA-device1\",\n deviceModel: makeMockDeviceModel(\"transportA-device1\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n {\n id: \"transportB-device1\",\n deviceModel: makeMockDeviceModel(\"transportB-device1\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n ]);\n\n // When transportB emits 2 known devices\n transportBKnownDevicesSubject.next([\n makeMockTransportDiscoveredDevice(\"transportB-device1\"),\n makeMockTransportDiscoveredDevice(\"transportB-device2\"),\n ]);\n\n expect(observedDiscoveredDevices[2]).toEqual([\n {\n id: \"transportA-device1\",\n deviceModel: makeMockDeviceModel(\"transportA-device1\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n {\n id: \"transportB-device1\",\n deviceModel: makeMockDeviceModel(\"transportB-device1\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n {\n id: \"transportB-device2\",\n deviceModel: makeMockDeviceModel(\"transportB-device2\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n ]);\n\n // When transportA emits 0 known devices\n transportAKnownDevicesSubject.next([]);\n\n expect(observedDiscoveredDevices[3]).toEqual([\n {\n id: \"transportB-device1\",\n deviceModel: makeMockDeviceModel(\"transportB-device1\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n {\n id: \"transportB-device2\",\n deviceModel: makeMockDeviceModel(\"transportB-device2\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n ]);\n\n // When transport A listen observable completes\n transportAKnownDevicesSubject.complete();\n\n expect(onError).not.toHaveBeenCalled();\n expect(onComplete).not.toHaveBeenCalled(); // Should not complete yet because transportB has not completed\n\n // When transport B emits 0 known devices\n transportBKnownDevicesSubject.next([]);\n\n expect(observedDiscoveredDevices[4]).toEqual([]);\n\n // When transport B listen observable completes\n transportBKnownDevicesSubject.complete();\n\n expect(onError).not.toHaveBeenCalled();\n expect(onComplete).toHaveBeenCalled(); // Should complete now because all transports have completed\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["Subject", "DeviceModel", "deviceModelStubBuilder", "DefaultTransportService", "ListenToAvailableDevicesUseCase", "transportService", "makeMockTransport", "props", "mockInternalDeviceModel", "makeMockDeviceModel", "id", "setup2MockTransports", "transportAKnownDevicesSubject", "transportBKnownDevicesSubject", "transportA", "transportB", "makeMockTransportDiscoveredDevice", "resolve", "reject", "useCase", "observedDiscoveredDevices", "devices", "error", "onError", "onComplete"]
4
+ "sourcesContent": ["import { Just } from \"purify-ts\";\nimport { Subject } from \"rxjs\";\n\nimport { type DeviceId, DeviceModel } from \"@api/device/DeviceModel\";\nimport { deviceModelStubBuilder } from \"@api/device-model/model/DeviceModel.stub\";\nimport { type LoggerPublisherService } from \"@api/logger-publisher/service/LoggerPublisherService\";\nimport { type DiscoveredDevice } from \"@api/transport/model/DiscoveredDevice\";\nimport { type Transport } from \"@api/transport/model/Transport\";\nimport { type TransportDiscoveredDevice } from \"@api/transport/model/TransportDiscoveredDevice\";\nimport { DefaultLoggerPublisherService } from \"@internal/logger-publisher/service/DefaultLoggerPublisherService\";\nimport { DefaultTransportService } from \"@internal/transport/service/DefaultTransportService\";\nimport { type TransportService } from \"@internal/transport/service/TransportService\";\n\nimport { ListenToAvailableDevicesUseCase } from \"./ListenToAvailableDevicesUseCase\";\n\nvi.mock(\"@internal/transport/service/DefaultTransportService\");\n\nlet transportService: TransportService;\nlet logger: LoggerPublisherService;\nfunction makeMockTransport(props: Partial<Transport>): Transport {\n return {\n listenToAvailableDevices: vi.fn(),\n connect: vi.fn(),\n disconnect: vi.fn(),\n startDiscovering: vi.fn(),\n stopDiscovering: vi.fn(),\n getIdentifier: vi.fn(),\n isSupported: vi.fn(),\n ...props,\n };\n}\n\nconst mockInternalDeviceModel = deviceModelStubBuilder();\nfunction makeMockDeviceModel(id: DeviceId): DeviceModel {\n return new DeviceModel({\n id,\n model: mockInternalDeviceModel.id,\n name: mockInternalDeviceModel.productName,\n });\n}\n\nfunction setup2MockTransports() {\n const transportAKnownDevicesSubject = new Subject<\n TransportDiscoveredDevice[]\n >();\n const transportBKnownDevicesSubject = new Subject<\n TransportDiscoveredDevice[]\n >();\n const transportA = makeMockTransport({\n listenToAvailableDevices: () =>\n transportAKnownDevicesSubject.asObservable(),\n getIdentifier: () => \"mock-A\",\n });\n const transportB = makeMockTransport({\n listenToAvailableDevices: () =>\n transportBKnownDevicesSubject.asObservable(),\n getIdentifier: () => \"mock-B\",\n });\n return {\n transportAKnownDevicesSubject,\n transportBKnownDevicesSubject,\n transportA,\n transportB,\n };\n}\n\nfunction makeMockTransportDiscoveredDevice(\n id: string,\n): TransportDiscoveredDevice {\n return {\n id,\n deviceModel: mockInternalDeviceModel,\n transport: \"mock\",\n };\n}\n\ndescribe(\"ListenToAvailableDevicesUseCase\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n // @ts-expect-error mock\n transportService = new DefaultTransportService();\n logger = new DefaultLoggerPublisherService(\n [],\n \"listen-to-available-devices-use-case-test\",\n );\n });\n\n describe(\"when no transports are available\", () => {\n it(\"should return no discovered devices\", () =>\n new Promise<void>((resolve, reject) => {\n vi.spyOn(transportService, \"getAllTransports\").mockReturnValue([]);\n\n const useCase = new ListenToAvailableDevicesUseCase(\n transportService,\n () => logger,\n );\n\n const observedDiscoveredDevices: DiscoveredDevice[][] = [];\n useCase.execute({}).subscribe({\n next: (devices) => {\n observedDiscoveredDevices.push(devices);\n },\n complete: () => {\n try {\n expect(observedDiscoveredDevices).toEqual([[]]);\n resolve();\n } catch (error) {\n reject(error as Error);\n }\n },\n error: (error) => {\n reject(error);\n },\n });\n }));\n });\n\n describe(\"when one transport is available\", () => {\n it(\"should return discovered devices from one transport\", () => {\n const { transportA, transportAKnownDevicesSubject } =\n setup2MockTransports();\n\n vi.spyOn(transportService, \"getAllTransports\").mockReturnValue([\n transportA,\n ]);\n\n const observedDiscoveredDevices: DiscoveredDevice[][] = [];\n new ListenToAvailableDevicesUseCase(transportService, () => logger)\n .execute({})\n .subscribe((devices) => {\n observedDiscoveredDevices.push(devices);\n });\n\n // When transportA emits 1 known device\n transportAKnownDevicesSubject.next([\n makeMockTransportDiscoveredDevice(\"transportA-device1\"),\n ]);\n\n expect(observedDiscoveredDevices[0]).toEqual([\n {\n id: \"transportA-device1\",\n deviceModel: makeMockDeviceModel(\"transportA-device1\"),\n name: \"Ledger Nano X\",\n transport: \"mock\",\n rssi: undefined,\n },\n ]);\n\n // When transportA emits 2 known devices\n transportAKnownDevicesSubject.next([\n makeMockTransportDiscoveredDevice(\"transportA-device1\"),\n makeMockTransportDiscoveredDevice(\"transportA-device2\"),\n ]);\n\n expect(observedDiscoveredDevices[1]).toEqual([\n {\n id: \"transportA-device1\",\n deviceModel: makeMockDeviceModel(\"transportA-device1\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n {\n id: \"transportA-device2\",\n deviceModel: makeMockDeviceModel(\"transportA-device2\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n ]);\n\n // When transportA emits 1 known device (device1 disconnects)\n transportAKnownDevicesSubject.next([\n makeMockTransportDiscoveredDevice(\"transportA-device2\"),\n ]);\n\n expect(observedDiscoveredDevices[2]).toEqual([\n {\n id: \"transportA-device2\",\n deviceModel: makeMockDeviceModel(\"transportA-device2\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n ]);\n\n // When transportA emits 0 known devices (device2 disconnects)\n transportAKnownDevicesSubject.next([]);\n\n expect(observedDiscoveredDevices[3]).toEqual([]);\n });\n });\n\n describe(\"when multiple transports are available\", () => {\n it(\"should return discovered devices from one of the transports as soon as it emits\", () => {\n const { transportAKnownDevicesSubject, transportA, transportB } =\n setup2MockTransports();\n\n vi.spyOn(transportService, \"getAllTransports\").mockReturnValue([\n transportA,\n transportB,\n ]);\n\n const observedDiscoveredDevices: DiscoveredDevice[][] = [];\n\n const onError = vi.fn();\n const onComplete = vi.fn();\n\n new ListenToAvailableDevicesUseCase(transportService, () => logger)\n .execute({})\n .subscribe({\n next: (devices) => {\n observedDiscoveredDevices.push(devices);\n },\n error: onError,\n complete: onComplete,\n });\n\n // When transportA emits 1 known device\n transportAKnownDevicesSubject.next([\n makeMockTransportDiscoveredDevice(\"transportA-device1\"),\n ]);\n\n expect(observedDiscoveredDevices[0]).toEqual([\n {\n id: \"transportA-device1\",\n deviceModel: makeMockDeviceModel(\"transportA-device1\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n ]);\n\n // When transport A listen observable completes\n transportAKnownDevicesSubject.complete();\n\n expect(onError).not.toHaveBeenCalled();\n expect(onComplete).not.toHaveBeenCalled(); // Should not complete yet because transportB has not completed\n });\n\n it(\"should combine discovered devices from multiple transports\", () => {\n const {\n transportAKnownDevicesSubject,\n transportBKnownDevicesSubject,\n transportA,\n transportB,\n } = setup2MockTransports();\n\n const observedDiscoveredDevices: DiscoveredDevice[][] = [];\n\n vi.spyOn(transportService, \"getAllTransports\").mockReturnValue([\n transportA,\n transportB,\n ]);\n\n const onError = vi.fn();\n const onComplete = vi.fn();\n new ListenToAvailableDevicesUseCase(transportService, () => logger)\n .execute({})\n .subscribe({\n next: (devices) => {\n observedDiscoveredDevices.push(devices);\n },\n error: onError,\n complete: onComplete,\n });\n\n // When transportA emits 1 known device\n transportAKnownDevicesSubject.next([\n makeMockTransportDiscoveredDevice(\"transportA-device1\"),\n ]);\n\n expect(observedDiscoveredDevices[0]).toEqual([\n {\n id: \"transportA-device1\",\n deviceModel: makeMockDeviceModel(\"transportA-device1\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n ]);\n\n // When transportB emits 1 known device\n transportBKnownDevicesSubject.next([\n makeMockTransportDiscoveredDevice(\"transportB-device1\"),\n ]);\n\n expect(observedDiscoveredDevices[1]).toEqual([\n {\n id: \"transportA-device1\",\n deviceModel: makeMockDeviceModel(\"transportA-device1\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n {\n id: \"transportB-device1\",\n deviceModel: makeMockDeviceModel(\"transportB-device1\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n ]);\n\n // When transportB emits 2 known devices\n transportBKnownDevicesSubject.next([\n makeMockTransportDiscoveredDevice(\"transportB-device1\"),\n makeMockTransportDiscoveredDevice(\"transportB-device2\"),\n ]);\n\n expect(observedDiscoveredDevices[2]).toEqual([\n {\n id: \"transportA-device1\",\n deviceModel: makeMockDeviceModel(\"transportA-device1\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n {\n id: \"transportB-device1\",\n deviceModel: makeMockDeviceModel(\"transportB-device1\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n {\n id: \"transportB-device2\",\n deviceModel: makeMockDeviceModel(\"transportB-device2\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n ]);\n\n // When transportA emits 0 known devices\n transportAKnownDevicesSubject.next([]);\n\n expect(observedDiscoveredDevices[3]).toEqual([\n {\n id: \"transportB-device1\",\n deviceModel: makeMockDeviceModel(\"transportB-device1\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n {\n id: \"transportB-device2\",\n deviceModel: makeMockDeviceModel(\"transportB-device2\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n ]);\n\n // When transport A listen observable completes\n transportAKnownDevicesSubject.complete();\n\n expect(onError).not.toHaveBeenCalled();\n expect(onComplete).not.toHaveBeenCalled(); // Should not complete yet because transportB has not completed\n\n // When transport B emits 0 known devices\n transportBKnownDevicesSubject.next([]);\n\n expect(observedDiscoveredDevices[4]).toEqual([]);\n\n // When transport B listen observable completes\n transportBKnownDevicesSubject.complete();\n\n expect(onError).not.toHaveBeenCalled();\n expect(onComplete).toHaveBeenCalled(); // Should complete now because all transports have completed\n });\n\n it(\"should filter out the devices by transport\", () => {\n const {\n transportAKnownDevicesSubject,\n transportBKnownDevicesSubject,\n transportA,\n transportB,\n } = setup2MockTransports();\n\n const all = vi\n .spyOn(transportService, \"getAllTransports\")\n .mockReturnValue([transportA, transportB]);\n\n vi.spyOn(transportService, \"getTransport\").mockReturnValue(\n Just(transportA),\n );\n\n const observedDiscoveredDevices: DiscoveredDevice[][] = [];\n\n const onError = vi.fn();\n const onComplete = vi.fn();\n\n new ListenToAvailableDevicesUseCase(transportService, () => logger)\n .execute({ transport: \"mock-A\" })\n .subscribe({\n next: (devices) => {\n observedDiscoveredDevices.push(devices);\n },\n error: onError,\n complete: onComplete,\n });\n\n expect(all).toBeCalledTimes(1);\n expect(transportService.getTransport).toBeCalledWith(\"mock-A\");\n\n // When transportA emits 1 known device\n transportAKnownDevicesSubject.next([\n makeMockTransportDiscoveredDevice(\"transportA-device1\"),\n ]);\n\n expect(observedDiscoveredDevices[0]).toEqual([\n {\n id: \"transportA-device1\",\n deviceModel: makeMockDeviceModel(\"transportA-device1\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n ]);\n\n // When transportB emits 1 known device\n transportBKnownDevicesSubject.next([\n makeMockTransportDiscoveredDevice(\"transportB-device1\"),\n ]);\n\n expect(observedDiscoveredDevices.length).toEqual(1);\n\n // When transportB emits 2 known devices\n transportBKnownDevicesSubject.next([\n makeMockTransportDiscoveredDevice(\"transportB-device1\"),\n makeMockTransportDiscoveredDevice(\"transportB-device2\"),\n ]);\n\n // Only transportA is listened to, so only transportA devices should be returned\n expect(observedDiscoveredDevices.length).toEqual(1);\n\n // // When transportA emits 0 known devices\n transportAKnownDevicesSubject.next([]);\n\n expect(observedDiscoveredDevices[0]).toEqual([\n {\n id: \"transportA-device1\",\n deviceModel: makeMockDeviceModel(\"transportA-device1\"),\n transport: \"mock\",\n name: \"Ledger Nano X\",\n rssi: undefined,\n },\n ]);\n\n // // When transport A listen observable completes\n transportAKnownDevicesSubject.complete();\n\n expect(onError).not.toHaveBeenCalled();\n expect(onComplete).toHaveBeenCalledOnce(); // Should complete now because transportA has completed\n\n // When transport B emits 0 known devices\n transportBKnownDevicesSubject.next([]);\n\n expect(observedDiscoveredDevices[1]).toEqual([]);\n\n // When transport B listen observable completes\n transportBKnownDevicesSubject.complete();\n\n expect(onError).not.toHaveBeenCalled();\n expect(onComplete).toHaveBeenCalledOnce(); // Should not rerun complete because transportB is not listened to\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["Just", "Subject", "DeviceModel", "deviceModelStubBuilder", "DefaultLoggerPublisherService", "DefaultTransportService", "ListenToAvailableDevicesUseCase", "transportService", "logger", "makeMockTransport", "props", "mockInternalDeviceModel", "makeMockDeviceModel", "id", "setup2MockTransports", "transportAKnownDevicesSubject", "transportBKnownDevicesSubject", "transportA", "transportB", "makeMockTransportDiscoveredDevice", "resolve", "reject", "useCase", "observedDiscoveredDevices", "devices", "error", "onError", "onComplete", "all"]
7
7
  }
@@ -1,2 +1,2 @@
1
- var k=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var m=(s,e,t,o)=>{for(var r=o>1?void 0:o?l(e,t):e,c=s.length-1,i;c>=0;c--)(i=s[c])&&(r=(o?i(e,t,r):i(r))||r);return o&&r&&k(e,t,r),r},p=(s,e)=>(t,o)=>e(t,o,s);import{inject as b,injectable as h}from"inversify";import S from"isomorphic-ws";import{Left as W,Right as d}from"purify-ts";import n from"url";import{secureChannelTypes as u}from"../../secure-channel/di/secureChannelTypes";import{WebSocketConnectionError as f}from"../../secure-channel/model/Errors";let a=class{webSocketBaseUrl;constructor({webSocketUrl:e}){this.webSocketBaseUrl=e}genuineCheck(e){const t=n.format({pathname:`${this.webSocketBaseUrl}/genuine`,query:e});return this._connectWebSocket(t)}listInstalledApps(e){const t=n.format({pathname:`${this.webSocketBaseUrl}/apps/list`,query:e});return this._connectWebSocket(t)}updateMcu(e){const t=n.format({pathname:`${this.webSocketBaseUrl}/mcu`,query:e});return this._connectWebSocket(t)}updateFirmware(e){const t=n.format({pathname:`${this.webSocketBaseUrl}/install`,query:e});return this._connectWebSocket(t)}installApp(e){const t=n.format({pathname:`${this.webSocketBaseUrl}/install`,query:e});return this._connectWebSocket(t)}uninstallApp(e){const t=n.format({pathname:`${this.webSocketBaseUrl}/install`,query:e});return this._connectWebSocket(t)}_connectWebSocket(e){try{return d(new S(e))}catch(t){return W(new f(t))}}};a=m([h(),p(0,b(u.DmkConfig))],a);export{a as DefaultSecureChannelDataSource};
1
+ var k=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var m=(s,e,t,o)=>{for(var r=o>1?void 0:o?l(e,t):e,c=s.length-1,i;c>=0;c--)(i=s[c])&&(r=(o?i(e,t,r):i(r))||r);return o&&r&&k(e,t,r),r},p=(s,e)=>(t,o)=>e(t,o,s);import{inject as b,injectable as h}from"inversify";import S from"isomorphic-ws";import{Left as W,Right as d}from"purify-ts";import n from"url";import{secureChannelTypes as u}from"../../secure-channel/di/secureChannelTypes";import{WebSocketConnectionError as f}from"../../secure-channel/model/Errors";let a=class{webSocketBaseUrl;constructor({webSocketUrl:e}){this.webSocketBaseUrl=e}genuineCheck(e){const t=n.format({pathname:`${this.webSocketBaseUrl}/genuine`,query:e});return this._connectWebSocket(t)}installApp(e){const t=n.format({pathname:`${this.webSocketBaseUrl}/install`,query:e});return this._connectWebSocket(t)}listInstalledApps(e){const t=n.format({pathname:`${this.webSocketBaseUrl}/apps/list`,query:e});return this._connectWebSocket(t)}uninstallApp(e){const t=n.format({pathname:`${this.webSocketBaseUrl}/install`,query:e});return this._connectWebSocket(t)}updateFirmware(e){const t=n.format({pathname:`${this.webSocketBaseUrl}/install`,query:e});return this._connectWebSocket(t)}updateMcu(e){const t=n.format({pathname:`${this.webSocketBaseUrl}/mcu`,query:e});return this._connectWebSocket(t)}_connectWebSocket(e){try{return d(new S(e))}catch(t){return W(new f(t))}}};a=m([h(),p(0,b(u.DmkConfig))],a);export{a as DefaultSecureChannelDataSource};
2
2
  //# sourceMappingURL=DefaultSecureChannelDataSource.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/secure-channel/data/DefaultSecureChannelDataSource.ts"],
4
- "sourcesContent": ["import { inject, injectable } from \"inversify\";\nimport WebSocket from \"isomorphic-ws\";\nimport { Either, Left, Right } from \"purify-ts\";\nimport URL from \"url\";\n\nimport { type DmkConfig } from \"@api/DmkConfig\";\nimport { secureChannelTypes } from \"@internal/secure-channel/di/secureChannelTypes\";\nimport { WebSocketConnectionError } from \"@internal/secure-channel/model/Errors\";\nimport {\n GenuineCheckParams,\n InstallAppsParams,\n ListInstalledAppsParams,\n UninstallAppsParams,\n UpdateFirmwareParams,\n UpdateMcuParams,\n} from \"@internal/secure-channel/model/Params\";\n\nimport { SecureChannelDataSource } from \"./SecureChannelDataSource\";\n\n@injectable()\nexport class DefaultSecureChannelDataSource implements SecureChannelDataSource {\n private readonly webSocketBaseUrl: string;\n\n constructor(\n @inject(secureChannelTypes.DmkConfig)\n { webSocketUrl }: DmkConfig,\n ) {\n this.webSocketBaseUrl = webSocketUrl;\n }\n\n genuineCheck(\n params: GenuineCheckParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = URL.format({\n pathname: `${this.webSocketBaseUrl}/genuine`,\n query: params,\n });\n return this._connectWebSocket(address);\n }\n\n listInstalledApps(\n params: ListInstalledAppsParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = URL.format({\n pathname: `${this.webSocketBaseUrl}/apps/list`,\n query: params,\n });\n return this._connectWebSocket(address);\n }\n\n updateMcu(\n params: UpdateMcuParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = URL.format({\n pathname: `${this.webSocketBaseUrl}/mcu`,\n query: params,\n });\n return this._connectWebSocket(address);\n }\n\n updateFirmware(\n params: UpdateFirmwareParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = URL.format({\n pathname: `${this.webSocketBaseUrl}/install`,\n query: params,\n });\n return this._connectWebSocket(address);\n }\n\n installApp(\n params: InstallAppsParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = URL.format({\n pathname: `${this.webSocketBaseUrl}/install`,\n query: params,\n });\n return this._connectWebSocket(address);\n }\n\n uninstallApp(\n params: UninstallAppsParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = URL.format({\n pathname: `${this.webSocketBaseUrl}/install`,\n query: params,\n });\n return this._connectWebSocket(address);\n }\n\n _connectWebSocket(\n address: string,\n ): Either<WebSocketConnectionError, WebSocket> {\n try {\n return Right(new WebSocket(address));\n } catch (error) {\n return Left(new WebSocketConnectionError(error));\n }\n }\n}\n"],
5
- "mappings": "iOAAA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YACnC,OAAOC,MAAe,gBACtB,OAAiB,QAAAC,EAAM,SAAAC,MAAa,YACpC,OAAOC,MAAS,MAGhB,OAAS,sBAAAC,MAA0B,iDACnC,OAAS,4BAAAC,MAAgC,wCAalC,IAAMC,EAAN,KAAwE,CAC5D,iBAEjB,YAEE,CAAE,aAAAC,CAAa,EACf,CACA,KAAK,iBAAmBA,CAC1B,CAEA,aACEC,EAC6C,CAC7C,MAAMC,EAAUC,EAAI,OAAO,CACzB,SAAU,GAAG,KAAK,gBAAgB,WAClC,MAAOF,CACT,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,kBACED,EAC6C,CAC7C,MAAMC,EAAUC,EAAI,OAAO,CACzB,SAAU,GAAG,KAAK,gBAAgB,aAClC,MAAOF,CACT,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,UACED,EAC6C,CAC7C,MAAMC,EAAUC,EAAI,OAAO,CACzB,SAAU,GAAG,KAAK,gBAAgB,OAClC,MAAOF,CACT,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,eACED,EAC6C,CAC7C,MAAMC,EAAUC,EAAI,OAAO,CACzB,SAAU,GAAG,KAAK,gBAAgB,WAClC,MAAOF,CACT,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,WACED,EAC6C,CAC7C,MAAMC,EAAUC,EAAI,OAAO,CACzB,SAAU,GAAG,KAAK,gBAAgB,WAClC,MAAOF,CACT,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,aACED,EAC6C,CAC7C,MAAMC,EAAUC,EAAI,OAAO,CACzB,SAAU,GAAG,KAAK,gBAAgB,WAClC,MAAOF,CACT,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,kBACEA,EAC6C,CAC7C,GAAI,CACF,OAAOE,EAAM,IAAIC,EAAUH,CAAO,CAAC,CACrC,OAASI,EAAO,CACd,OAAOC,EAAK,IAAIC,EAAyBF,CAAK,CAAC,CACjD,CACF,CACF,EA/EaP,EAANU,EAAA,CADNC,EAAW,EAKPC,EAAA,EAAAC,EAAOC,EAAmB,SAAS,IAJ3Bd",
4
+ "sourcesContent": ["import { inject, injectable } from \"inversify\";\nimport WebSocket from \"isomorphic-ws\";\nimport { Either, Left, Right } from \"purify-ts\";\nimport URL from \"url\";\n\nimport { type DmkConfig } from \"@api/DmkConfig\";\nimport { secureChannelTypes } from \"@internal/secure-channel/di/secureChannelTypes\";\nimport { WebSocketConnectionError } from \"@internal/secure-channel/model/Errors\";\nimport {\n GenuineCheckParams,\n InstallAppsParams,\n ListInstalledAppsParams,\n UninstallAppsParams,\n UpdateFirmwareParams,\n UpdateMcuParams,\n} from \"@internal/secure-channel/model/Params\";\n\nimport { SecureChannelDataSource } from \"./SecureChannelDataSource\";\n\n@injectable()\nexport class DefaultSecureChannelDataSource implements SecureChannelDataSource {\n private readonly webSocketBaseUrl: string;\n\n constructor(\n @inject(secureChannelTypes.DmkConfig)\n { webSocketUrl }: DmkConfig,\n ) {\n this.webSocketBaseUrl = webSocketUrl;\n }\n\n genuineCheck(\n params: GenuineCheckParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = URL.format({\n pathname: `${this.webSocketBaseUrl}/genuine`,\n query: params,\n });\n return this._connectWebSocket(address);\n }\n\n installApp(\n params: InstallAppsParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = URL.format({\n pathname: `${this.webSocketBaseUrl}/install`,\n query: params,\n });\n return this._connectWebSocket(address);\n }\n\n listInstalledApps(\n params: ListInstalledAppsParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = URL.format({\n pathname: `${this.webSocketBaseUrl}/apps/list`,\n query: params,\n });\n return this._connectWebSocket(address);\n }\n\n uninstallApp(\n params: UninstallAppsParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = URL.format({\n pathname: `${this.webSocketBaseUrl}/install`,\n query: params,\n });\n return this._connectWebSocket(address);\n }\n\n updateFirmware(\n params: UpdateFirmwareParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = URL.format({\n pathname: `${this.webSocketBaseUrl}/install`,\n query: params,\n });\n return this._connectWebSocket(address);\n }\n\n updateMcu(\n params: UpdateMcuParams,\n ): Either<WebSocketConnectionError, WebSocket> {\n const address = URL.format({\n pathname: `${this.webSocketBaseUrl}/mcu`,\n query: params,\n });\n return this._connectWebSocket(address);\n }\n\n _connectWebSocket(\n address: string,\n ): Either<WebSocketConnectionError, WebSocket> {\n try {\n return Right(new WebSocket(address));\n } catch (error) {\n return Left(new WebSocketConnectionError(error));\n }\n }\n}\n"],
5
+ "mappings": "iOAAA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YACnC,OAAOC,MAAe,gBACtB,OAAiB,QAAAC,EAAM,SAAAC,MAAa,YACpC,OAAOC,MAAS,MAGhB,OAAS,sBAAAC,MAA0B,iDACnC,OAAS,4BAAAC,MAAgC,wCAalC,IAAMC,EAAN,KAAwE,CAC5D,iBAEjB,YAEE,CAAE,aAAAC,CAAa,EACf,CACA,KAAK,iBAAmBA,CAC1B,CAEA,aACEC,EAC6C,CAC7C,MAAMC,EAAUC,EAAI,OAAO,CACzB,SAAU,GAAG,KAAK,gBAAgB,WAClC,MAAOF,CACT,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,WACED,EAC6C,CAC7C,MAAMC,EAAUC,EAAI,OAAO,CACzB,SAAU,GAAG,KAAK,gBAAgB,WAClC,MAAOF,CACT,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,kBACED,EAC6C,CAC7C,MAAMC,EAAUC,EAAI,OAAO,CACzB,SAAU,GAAG,KAAK,gBAAgB,aAClC,MAAOF,CACT,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,aACED,EAC6C,CAC7C,MAAMC,EAAUC,EAAI,OAAO,CACzB,SAAU,GAAG,KAAK,gBAAgB,WAClC,MAAOF,CACT,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,eACED,EAC6C,CAC7C,MAAMC,EAAUC,EAAI,OAAO,CACzB,SAAU,GAAG,KAAK,gBAAgB,WAClC,MAAOF,CACT,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,UACED,EAC6C,CAC7C,MAAMC,EAAUC,EAAI,OAAO,CACzB,SAAU,GAAG,KAAK,gBAAgB,OAClC,MAAOF,CACT,CAAC,EACD,OAAO,KAAK,kBAAkBC,CAAO,CACvC,CAEA,kBACEA,EAC6C,CAC7C,GAAI,CACF,OAAOE,EAAM,IAAIC,EAAUH,CAAO,CAAC,CACrC,OAASI,EAAO,CACd,OAAOC,EAAK,IAAIC,EAAyBF,CAAK,CAAC,CACjD,CACF,CACF,EA/EaP,EAANU,EAAA,CADNC,EAAW,EAKPC,EAAA,EAAAC,EAAOC,EAAmB,SAAS,IAJ3Bd",
6
6
  "names": ["inject", "injectable", "WebSocket", "Left", "Right", "URL", "secureChannelTypes", "WebSocketConnectionError", "DefaultSecureChannelDataSource", "webSocketUrl", "params", "address", "URL", "Right", "WebSocket", "error", "Left", "WebSocketConnectionError", "__decorateClass", "injectable", "__decorateParam", "inject", "secureChannelTypes"]
7
7
  }
@@ -1,2 +1,2 @@
1
- class n{constructor(r){this.error=r;this.originalError=r}_tag="WebSocketConnectionError";originalError}export{n as WebSocketConnectionError};
1
+ class n{constructor(r){this.error=r;this.originalError=r}_tag="WebSocketConnectionError";originalError}class e{constructor(r){this.error=r;this.originalError=r}_tag="SecureChannelError";originalError}export{e as SecureChannelError,n as WebSocketConnectionError};
2
2
  //# sourceMappingURL=Errors.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/secure-channel/model/Errors.ts"],
4
- "sourcesContent": ["import { type DmkError } from \"@api/Error\";\n\nexport class WebSocketConnectionError implements DmkError {\n _tag = \"WebSocketConnectionError\";\n originalError?: unknown;\n\n constructor(public readonly error: unknown) {\n this.originalError = error;\n }\n}\n"],
5
- "mappings": "AAEO,MAAMA,CAA6C,CAIxD,YAA4BC,EAAgB,CAAhB,WAAAA,EAC1B,KAAK,cAAgBA,CACvB,CALA,KAAO,2BACP,aAKF",
6
- "names": ["WebSocketConnectionError", "error"]
4
+ "sourcesContent": ["import { type DmkError } from \"@api/Error\";\n\nexport class WebSocketConnectionError implements DmkError {\n _tag = \"WebSocketConnectionError\";\n originalError?: unknown;\n\n constructor(public readonly error: unknown) {\n this.originalError = error;\n }\n}\n\nexport class SecureChannelError implements DmkError {\n _tag = \"SecureChannelError\";\n originalError?: unknown;\n\n constructor(public readonly error: unknown) {\n this.originalError = error;\n }\n}\n"],
5
+ "mappings": "AAEO,MAAMA,CAA6C,CAIxD,YAA4BC,EAAgB,CAAhB,WAAAA,EAC1B,KAAK,cAAgBA,CACvB,CALA,KAAO,2BACP,aAKF,CAEO,MAAMC,CAAuC,CAIlD,YAA4BD,EAAgB,CAAhB,WAAAA,EAC1B,KAAK,cAAgBA,CACvB,CALA,KAAO,qBACP,aAKF",
6
+ "names": ["WebSocketConnectionError", "error", "SecureChannelError"]
7
7
  }
@@ -1,2 +1,2 @@
1
- var d=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var m=(n,e,r,t)=>{for(var a=t>1?void 0:t?u(e,r):e,o=n.length-1,s;o>=0;o--)(s=n[o])&&(a=(t?s(e,r,a):s(a))||a);return t&&a&&d(e,r,a),a},l=(n,e)=>(r,t)=>e(r,t,n);import{inject as S,injectable as h}from"inversify";import{secureChannelTypes as g}from"../../secure-channel/di/secureChannelTypes";let i=class{constructor(e){this.dataSource=e}genuineCheck(e,r){const t={targetId:e.targetId.toString(),perso:r.perso};return this.dataSource.genuineCheck(t)}listInstalledApps(e,r){const t={targetId:e.targetId.toString(),perso:r.perso};return this.dataSource.listInstalledApps(t)}updateMcu(e,r){const t={targetId:e.targetId.toString(),version:r.version};return this.dataSource.updateMcu(t)}updateFirmware(e,r){const t={targetId:e.targetId.toString(),perso:r.perso,firmware:r.firmware,firmwareKey:r.firmwareKey};return this.dataSource.updateFirmware(t)}installApp(e,r){const{perso:t,firmware:a,firmwareKey:o,deleteKey:s,hash:p}=r,c={targetId:e.targetId.toString(),perso:t,firmware:a,firmwareKey:o,deleteKey:s,hash:p};return this.dataSource.installApp(c)}uninstallApp(e,r){const{perso:t,firmware:a,firmwareKey:o,deleteKey:s,hash:p}=r,c={targetId:e.targetId.toString(),perso:t,firmware:a,firmwareKey:o,deleteKey:s,hash:p};return this.dataSource.uninstallApp(c)}};i=m([h(),l(0,S(g.SecureChannelDataSource))],i);export{i as DefaultSecureChannelService};
1
+ var d=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var m=(n,e,r,t)=>{for(var a=t>1?void 0:t?u(e,r):e,o=n.length-1,s;o>=0;o--)(s=n[o])&&(a=(t?s(e,r,a):s(a))||a);return t&&a&&d(e,r,a),a},l=(n,e)=>(r,t)=>e(r,t,n);import{inject as S,injectable as h}from"inversify";import{secureChannelTypes as g}from"../../secure-channel/di/secureChannelTypes";let i=class{constructor(e){this.dataSource=e}genuineCheck(e,r){const t={targetId:e.targetId.toString(),perso:r.perso};return this.dataSource.genuineCheck(t)}installApp(e,r){const{perso:t,firmware:a,firmwareKey:o,deleteKey:s,hash:p}=r,c={targetId:e.targetId.toString(),perso:t,firmware:a,firmwareKey:o,deleteKey:s,hash:p};return this.dataSource.installApp(c)}listInstalledApps(e,r){const t={targetId:e.targetId.toString(),perso:r.perso};return this.dataSource.listInstalledApps(t)}uninstallApp(e,r){const{perso:t,firmware:a,firmwareKey:o,deleteKey:s,hash:p}=r,c={targetId:e.targetId.toString(),perso:t,firmware:a,firmwareKey:o,deleteKey:s,hash:p};return this.dataSource.uninstallApp(c)}updateFirmware(e,r){const t={targetId:e.targetId.toString(),perso:r.perso,firmware:r.firmware,firmwareKey:r.firmwareKey};return this.dataSource.updateFirmware(t)}updateMcu(e,r){const t={targetId:e.targetId.toString(),version:r.version};return this.dataSource.updateMcu(t)}};i=m([h(),l(0,S(g.SecureChannelDataSource))],i);export{i as DefaultSecureChannelService};
2
2
  //# sourceMappingURL=DefaultSecureChannelService.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/secure-channel/service/DefaultSecureChannelService.ts"],
4
- "sourcesContent": ["import { inject, injectable } from \"inversify\";\nimport WebSocket from \"isomorphic-ws\";\nimport { Either } from \"purify-ts\";\n\nimport { GetOsVersionResponse } from \"@api/index\";\nimport { Application } from \"@internal/manager-api/model/Application\";\nimport { FinalFirmware } from \"@internal/manager-api/model/Firmware\";\nimport { type SecureChannelDataSource } from \"@internal/secure-channel/data/SecureChannelDataSource\";\nimport { secureChannelTypes } from \"@internal/secure-channel/di/secureChannelTypes\";\nimport { WebSocketConnectionError } from \"@internal/secure-channel/model/Errors\";\nimport {\n GenuineCheckParams,\n InstallAppsParams,\n ListInstalledAppsParams,\n UninstallAppsParams,\n UpdateFirmwareParams,\n UpdateMcuParams,\n} from \"@internal/secure-channel/model/Params\";\n\nimport { SecureChannelService } from \"./SecureChannelService\";\n\n@injectable()\nexport class DefaultSecureChannelService implements SecureChannelService {\n constructor(\n @inject(secureChannelTypes.SecureChannelDataSource)\n private readonly dataSource: SecureChannelDataSource,\n ) {}\n\n genuineCheck(\n deviceInfo: GetOsVersionResponse,\n finalFirmware: FinalFirmware,\n ): Either<WebSocketConnectionError, WebSocket> {\n const params: GenuineCheckParams = {\n targetId: deviceInfo.targetId.toString(),\n perso: finalFirmware.perso,\n };\n return this.dataSource.genuineCheck(params);\n }\n\n listInstalledApps(\n deviceInfo: GetOsVersionResponse,\n finalFirmware: FinalFirmware,\n ): Either<WebSocketConnectionError, WebSocket> {\n const params: ListInstalledAppsParams = {\n targetId: deviceInfo.targetId.toString(),\n perso: finalFirmware.perso,\n };\n return this.dataSource.listInstalledApps(params);\n }\n\n updateMcu(\n deviceInfo: GetOsVersionResponse,\n param: { version: string },\n ): Either<WebSocketConnectionError, WebSocket> {\n const params: UpdateMcuParams = {\n targetId: deviceInfo.targetId.toString(),\n version: param.version,\n };\n return this.dataSource.updateMcu(params);\n }\n\n updateFirmware(\n deviceInfo: GetOsVersionResponse,\n finalFirmware: FinalFirmware,\n ): Either<WebSocketConnectionError, WebSocket> {\n const params: UpdateFirmwareParams = {\n targetId: deviceInfo.targetId.toString(),\n perso: finalFirmware.perso,\n firmware: finalFirmware.firmware,\n firmwareKey: finalFirmware.firmwareKey,\n };\n return this.dataSource.updateFirmware(params);\n }\n\n installApp(\n deviceInfo: GetOsVersionResponse,\n app: Application,\n ): Either<WebSocketConnectionError, WebSocket> {\n const { perso, firmware, firmwareKey, deleteKey, hash } = app;\n const params: InstallAppsParams = {\n targetId: deviceInfo.targetId.toString(),\n perso,\n firmware,\n firmwareKey,\n deleteKey,\n hash,\n };\n return this.dataSource.installApp(params);\n }\n\n uninstallApp(\n deviceInfo: GetOsVersionResponse,\n app: Application,\n ): Either<WebSocketConnectionError, WebSocket> {\n const { perso, firmware, firmwareKey, deleteKey, hash } = app;\n const params: UninstallAppsParams = {\n targetId: deviceInfo.targetId.toString(),\n perso,\n firmware,\n firmwareKey,\n deleteKey,\n hash,\n };\n return this.dataSource.uninstallApp(params);\n }\n}\n"],
5
- "mappings": "iOAAA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YAQnC,OAAS,sBAAAC,MAA0B,iDAc5B,IAAMC,EAAN,KAAkE,CACvE,YAEmBC,EACjB,CADiB,gBAAAA,CAChB,CAEH,aACEC,EACAC,EAC6C,CAC7C,MAAMC,EAA6B,CACjC,SAAUF,EAAW,SAAS,SAAS,EACvC,MAAOC,EAAc,KACvB,EACA,OAAO,KAAK,WAAW,aAAaC,CAAM,CAC5C,CAEA,kBACEF,EACAC,EAC6C,CAC7C,MAAMC,EAAkC,CACtC,SAAUF,EAAW,SAAS,SAAS,EACvC,MAAOC,EAAc,KACvB,EACA,OAAO,KAAK,WAAW,kBAAkBC,CAAM,CACjD,CAEA,UACEF,EACAG,EAC6C,CAC7C,MAAMD,EAA0B,CAC9B,SAAUF,EAAW,SAAS,SAAS,EACvC,QAASG,EAAM,OACjB,EACA,OAAO,KAAK,WAAW,UAAUD,CAAM,CACzC,CAEA,eACEF,EACAC,EAC6C,CAC7C,MAAMC,EAA+B,CACnC,SAAUF,EAAW,SAAS,SAAS,EACvC,MAAOC,EAAc,MACrB,SAAUA,EAAc,SACxB,YAAaA,EAAc,WAC7B,EACA,OAAO,KAAK,WAAW,eAAeC,CAAM,CAC9C,CAEA,WACEF,EACAI,EAC6C,CAC7C,KAAM,CAAE,MAAAC,EAAO,SAAAC,EAAU,YAAAC,EAAa,UAAAC,EAAW,KAAAC,CAAK,EAAIL,EACpDF,EAA4B,CAChC,SAAUF,EAAW,SAAS,SAAS,EACvC,MAAAK,EACA,SAAAC,EACA,YAAAC,EACA,UAAAC,EACA,KAAAC,CACF,EACA,OAAO,KAAK,WAAW,WAAWP,CAAM,CAC1C,CAEA,aACEF,EACAI,EAC6C,CAC7C,KAAM,CAAE,MAAAC,EAAO,SAAAC,EAAU,YAAAC,EAAa,UAAAC,EAAW,KAAAC,CAAK,EAAIL,EACpDF,EAA8B,CAClC,SAAUF,EAAW,SAAS,SAAS,EACvC,MAAAK,EACA,SAAAC,EACA,YAAAC,EACA,UAAAC,EACA,KAAAC,CACF,EACA,OAAO,KAAK,WAAW,aAAaP,CAAM,CAC5C,CACF,EAnFaJ,EAANY,EAAA,CADNC,EAAW,EAGPC,EAAA,EAAAC,EAAOC,EAAmB,uBAAuB,IAFzChB",
6
- "names": ["inject", "injectable", "secureChannelTypes", "DefaultSecureChannelService", "dataSource", "deviceInfo", "finalFirmware", "params", "param", "app", "perso", "firmware", "firmwareKey", "deleteKey", "hash", "__decorateClass", "injectable", "__decorateParam", "inject", "secureChannelTypes"]
4
+ "sourcesContent": ["import { inject, injectable } from \"inversify\";\nimport WebSocket from \"isomorphic-ws\";\nimport { Either } from \"purify-ts\";\n\nimport { GetOsVersionResponse } from \"@api/index\";\nimport { Application } from \"@internal/manager-api/model/Application\";\nimport { FinalFirmware } from \"@internal/manager-api/model/Firmware\";\nimport { type SecureChannelDataSource } from \"@internal/secure-channel/data/SecureChannelDataSource\";\nimport { secureChannelTypes } from \"@internal/secure-channel/di/secureChannelTypes\";\nimport { WebSocketConnectionError } from \"@internal/secure-channel/model/Errors\";\nimport {\n GenuineCheckParams,\n InstallAppsParams,\n ListInstalledAppsParams,\n UninstallAppsParams,\n UpdateFirmwareParams,\n UpdateMcuParams,\n} from \"@internal/secure-channel/model/Params\";\n\nimport { SecureChannelService } from \"./SecureChannelService\";\n\n@injectable()\nexport class DefaultSecureChannelService implements SecureChannelService {\n constructor(\n @inject(secureChannelTypes.SecureChannelDataSource)\n private readonly dataSource: SecureChannelDataSource,\n ) {}\n\n genuineCheck(\n deviceInfo: GetOsVersionResponse,\n finalFirmware: FinalFirmware,\n ): Either<WebSocketConnectionError, WebSocket> {\n const params: GenuineCheckParams = {\n targetId: deviceInfo.targetId.toString(),\n perso: finalFirmware.perso,\n };\n return this.dataSource.genuineCheck(params);\n }\n\n installApp(\n deviceInfo: GetOsVersionResponse,\n app: Application,\n ): Either<WebSocketConnectionError, WebSocket> {\n const { perso, firmware, firmwareKey, deleteKey, hash } = app;\n const params: InstallAppsParams = {\n targetId: deviceInfo.targetId.toString(),\n perso,\n firmware,\n firmwareKey,\n deleteKey,\n hash,\n };\n return this.dataSource.installApp(params);\n }\n\n listInstalledApps(\n deviceInfo: GetOsVersionResponse,\n finalFirmware: FinalFirmware,\n ): Either<WebSocketConnectionError, WebSocket> {\n const params: ListInstalledAppsParams = {\n targetId: deviceInfo.targetId.toString(),\n perso: finalFirmware.perso,\n };\n return this.dataSource.listInstalledApps(params);\n }\n\n uninstallApp(\n deviceInfo: GetOsVersionResponse,\n app: Application,\n ): Either<WebSocketConnectionError, WebSocket> {\n const { perso, firmware, firmwareKey, deleteKey, hash } = app;\n const params: UninstallAppsParams = {\n targetId: deviceInfo.targetId.toString(),\n perso,\n firmware,\n firmwareKey,\n deleteKey,\n hash,\n };\n return this.dataSource.uninstallApp(params);\n }\n\n updateFirmware(\n deviceInfo: GetOsVersionResponse,\n finalFirmware: FinalFirmware,\n ): Either<WebSocketConnectionError, WebSocket> {\n const params: UpdateFirmwareParams = {\n targetId: deviceInfo.targetId.toString(),\n perso: finalFirmware.perso,\n firmware: finalFirmware.firmware,\n firmwareKey: finalFirmware.firmwareKey,\n };\n return this.dataSource.updateFirmware(params);\n }\n\n updateMcu(\n deviceInfo: GetOsVersionResponse,\n param: { version: string },\n ): Either<WebSocketConnectionError, WebSocket> {\n const params: UpdateMcuParams = {\n targetId: deviceInfo.targetId.toString(),\n version: param.version,\n };\n return this.dataSource.updateMcu(params);\n }\n}\n"],
5
+ "mappings": "iOAAA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YAQnC,OAAS,sBAAAC,MAA0B,iDAc5B,IAAMC,EAAN,KAAkE,CACvE,YAEmBC,EACjB,CADiB,gBAAAA,CAChB,CAEH,aACEC,EACAC,EAC6C,CAC7C,MAAMC,EAA6B,CACjC,SAAUF,EAAW,SAAS,SAAS,EACvC,MAAOC,EAAc,KACvB,EACA,OAAO,KAAK,WAAW,aAAaC,CAAM,CAC5C,CAEA,WACEF,EACAG,EAC6C,CAC7C,KAAM,CAAE,MAAAC,EAAO,SAAAC,EAAU,YAAAC,EAAa,UAAAC,EAAW,KAAAC,CAAK,EAAIL,EACpDD,EAA4B,CAChC,SAAUF,EAAW,SAAS,SAAS,EACvC,MAAAI,EACA,SAAAC,EACA,YAAAC,EACA,UAAAC,EACA,KAAAC,CACF,EACA,OAAO,KAAK,WAAW,WAAWN,CAAM,CAC1C,CAEA,kBACEF,EACAC,EAC6C,CAC7C,MAAMC,EAAkC,CACtC,SAAUF,EAAW,SAAS,SAAS,EACvC,MAAOC,EAAc,KACvB,EACA,OAAO,KAAK,WAAW,kBAAkBC,CAAM,CACjD,CAEA,aACEF,EACAG,EAC6C,CAC7C,KAAM,CAAE,MAAAC,EAAO,SAAAC,EAAU,YAAAC,EAAa,UAAAC,EAAW,KAAAC,CAAK,EAAIL,EACpDD,EAA8B,CAClC,SAAUF,EAAW,SAAS,SAAS,EACvC,MAAAI,EACA,SAAAC,EACA,YAAAC,EACA,UAAAC,EACA,KAAAC,CACF,EACA,OAAO,KAAK,WAAW,aAAaN,CAAM,CAC5C,CAEA,eACEF,EACAC,EAC6C,CAC7C,MAAMC,EAA+B,CACnC,SAAUF,EAAW,SAAS,SAAS,EACvC,MAAOC,EAAc,MACrB,SAAUA,EAAc,SACxB,YAAaA,EAAc,WAC7B,EACA,OAAO,KAAK,WAAW,eAAeC,CAAM,CAC9C,CAEA,UACEF,EACAS,EAC6C,CAC7C,MAAMP,EAA0B,CAC9B,SAAUF,EAAW,SAAS,SAAS,EACvC,QAASS,EAAM,OACjB,EACA,OAAO,KAAK,WAAW,UAAUP,CAAM,CACzC,CACF,EAnFaJ,EAANY,EAAA,CADNC,EAAW,EAGPC,EAAA,EAAAC,EAAOC,EAAmB,uBAAuB,IAFzChB",
6
+ "names": ["inject", "injectable", "secureChannelTypes", "DefaultSecureChannelService", "dataSource", "deviceInfo", "finalFirmware", "params", "app", "perso", "firmware", "firmwareKey", "deleteKey", "hash", "param", "__decorateClass", "injectable", "__decorateParam", "inject", "secureChannelTypes"]
7
7
  }