@hsuite/native-connect-angular 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/README.md +48 -0
  2. package/USAGE_EXAMPLES.md +476 -0
  3. package/assets/wallets/extension.svg +7 -0
  4. package/assets/wallets/hashpack.svg +6 -0
  5. package/assets/wallets/hsuite.svg +11 -0
  6. package/assets/wallets/kabila.svg +11 -0
  7. package/assets/wallets/walletconnect.svg +13 -0
  8. package/coverage/base.css +224 -0
  9. package/coverage/block-navigation.js +87 -0
  10. package/coverage/coverage-summary.json +50 -0
  11. package/coverage/favicon.png +0 -0
  12. package/coverage/index.html +476 -0
  13. package/coverage/lcov-report/base.css +224 -0
  14. package/coverage/lcov-report/block-navigation.js +87 -0
  15. package/coverage/lcov-report/favicon.png +0 -0
  16. package/coverage/lcov-report/index.html +476 -0
  17. package/coverage/lcov-report/lib/components/account-selector/account-actions/account-actions.component.ts.html +868 -0
  18. package/coverage/lcov-report/lib/components/account-selector/account-actions/index.html +116 -0
  19. package/coverage/lcov-report/lib/components/account-selector/account-filter/account-filter.component.ts.html +1288 -0
  20. package/coverage/lcov-report/lib/components/account-selector/account-filter/index.html +116 -0
  21. package/coverage/lcov-report/lib/components/account-selector/account-formatting.service.ts.html +685 -0
  22. package/coverage/lcov-report/lib/components/account-selector/account-grouping.service.ts.html +766 -0
  23. package/coverage/lcov-report/lib/components/account-selector/account-list/account-list.component.ts.html +1495 -0
  24. package/coverage/lcov-report/lib/components/account-selector/account-list/index.html +116 -0
  25. package/coverage/lcov-report/lib/components/account-selector/account-selector.component.ts.html +1495 -0
  26. package/coverage/lcov-report/lib/components/account-selector/account-selector.service.ts.html +1588 -0
  27. package/coverage/lcov-report/lib/components/account-selector/index.html +161 -0
  28. package/coverage/lcov-report/lib/components/wallet-account-display/index.html +116 -0
  29. package/coverage/lcov-report/lib/components/wallet-account-display/wallet-account-display.component.ts.html +505 -0
  30. package/coverage/lcov-report/lib/components/wallet-connect-button/index.html +116 -0
  31. package/coverage/lcov-report/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +805 -0
  32. package/coverage/lcov-report/lib/components/wallet-connect-prompt/index.html +116 -0
  33. package/coverage/lcov-report/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +409 -0
  34. package/coverage/lcov-report/lib/components/wallet-connected-guard/index.html +116 -0
  35. package/coverage/lcov-report/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +304 -0
  36. package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +436 -0
  37. package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/index.html +116 -0
  38. package/coverage/lcov-report/lib/components/wallet-connection-modal/index.html +116 -0
  39. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/index.html +116 -0
  40. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +2287 -0
  41. package/coverage/lcov-report/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +2275 -0
  42. package/coverage/lcov-report/lib/components/wallet-session-display/index.html +116 -0
  43. package/coverage/lcov-report/lib/components/wallet-session-display/wallet-session-display.component.ts.html +676 -0
  44. package/coverage/lcov-report/lib/components/wallet-transaction-status/index.html +116 -0
  45. package/coverage/lcov-report/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +703 -0
  46. package/coverage/lcov-report/lib/directives/index.html +146 -0
  47. package/coverage/lcov-report/lib/directives/wallet-connected.directive.ts.html +670 -0
  48. package/coverage/lcov-report/lib/directives/wallet-context.directive.ts.html +547 -0
  49. package/coverage/lcov-report/lib/directives/wallet-events.directive.ts.html +781 -0
  50. package/coverage/lcov-report/lib/hsuite-wallet.module.ts.html +715 -0
  51. package/coverage/lcov-report/lib/index.html +116 -0
  52. package/coverage/lcov-report/lib/models/connection-config.model.ts.html +280 -0
  53. package/coverage/lcov-report/lib/models/index.html +131 -0
  54. package/coverage/lcov-report/lib/models/provider-types.ts.html +577 -0
  55. package/coverage/lcov-report/lib/providers/base-wallet-provider.ts.html +1138 -0
  56. package/coverage/lcov-report/lib/providers/hsuite-native/channel-client.service.ts.html +2671 -0
  57. package/coverage/lcov-report/lib/providers/hsuite-native/index.html +116 -0
  58. package/coverage/lcov-report/lib/providers/hsuite-native-provider.ts.html +2347 -0
  59. package/coverage/lcov-report/lib/providers/index.html +146 -0
  60. package/coverage/lcov-report/lib/providers/p2p-native/index.html +131 -0
  61. package/coverage/lcov-report/lib/providers/p2p-native/p2p-native.provider.ts.html +2254 -0
  62. package/coverage/lcov-report/lib/providers/p2p-native/p2p-session-manager.ts.html +2170 -0
  63. package/coverage/lcov-report/lib/providers/wallet-error-handler.ts.html +1132 -0
  64. package/coverage/lcov-report/lib/providers/walletconnect/core/index.html +176 -0
  65. package/coverage/lcov-report/lib/providers/walletconnect/core/session-health.ts.html +673 -0
  66. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +1177 -0
  67. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-provider.ts.html +2563 -0
  68. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +904 -0
  69. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +982 -0
  70. package/coverage/lcov-report/lib/providers/walletconnect/signers/hedera-signer.ts.html +1915 -0
  71. package/coverage/lcov-report/lib/providers/walletconnect/signers/index.html +146 -0
  72. package/coverage/lcov-report/lib/providers/walletconnect/signers/signer-factory.ts.html +445 -0
  73. package/coverage/lcov-report/lib/providers/walletconnect/signers/xrpl-signer.ts.html +1519 -0
  74. package/coverage/lcov-report/lib/services/index.html +191 -0
  75. package/coverage/lcov-report/lib/services/logger.service.ts.html +463 -0
  76. package/coverage/lcov-report/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1840 -0
  77. package/coverage/lcov-report/lib/services/transaction-builders/hedera-amount-utils.ts.html +337 -0
  78. package/coverage/lcov-report/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +3940 -0
  79. package/coverage/lcov-report/lib/services/transaction-builders/index.html +161 -0
  80. package/coverage/lcov-report/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +2581 -0
  81. package/coverage/lcov-report/lib/services/transaction.service.ts.html +1123 -0
  82. package/coverage/lcov-report/lib/services/unified-wallet.service.ts.html +2641 -0
  83. package/coverage/lcov-report/lib/services/wallet-context.service.ts.html +637 -0
  84. package/coverage/lcov-report/lib/services/wallet-event-bus.service.ts.html +643 -0
  85. package/coverage/lcov-report/lib/services/wallet-providers.service.ts.html +496 -0
  86. package/coverage/lcov-report/lib/transports/chrome-extension-transport.ts.html +823 -0
  87. package/coverage/lcov-report/lib/transports/index.html +116 -0
  88. package/coverage/lcov-report/lib/utils/index.html +116 -0
  89. package/coverage/lcov-report/lib/utils/ledger-icons.util.ts.html +319 -0
  90. package/coverage/lcov-report/prettify.css +1 -0
  91. package/coverage/lcov-report/prettify.js +2 -0
  92. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  93. package/coverage/lcov-report/sorter.js +210 -0
  94. package/coverage/lcov.info +19252 -0
  95. package/coverage/lib/components/account-selector/account-actions/account-actions.component.ts.html +868 -0
  96. package/coverage/lib/components/account-selector/account-actions/index.html +116 -0
  97. package/coverage/lib/components/account-selector/account-filter/account-filter.component.ts.html +1288 -0
  98. package/coverage/lib/components/account-selector/account-filter/index.html +116 -0
  99. package/coverage/lib/components/account-selector/account-formatting.service.ts.html +685 -0
  100. package/coverage/lib/components/account-selector/account-grouping.service.ts.html +766 -0
  101. package/coverage/lib/components/account-selector/account-list/account-list.component.ts.html +1495 -0
  102. package/coverage/lib/components/account-selector/account-list/index.html +116 -0
  103. package/coverage/lib/components/account-selector/account-selector.component.ts.html +1495 -0
  104. package/coverage/lib/components/account-selector/account-selector.service.ts.html +1588 -0
  105. package/coverage/lib/components/account-selector/index.html +161 -0
  106. package/coverage/lib/components/wallet-account-display/index.html +116 -0
  107. package/coverage/lib/components/wallet-account-display/wallet-account-display.component.ts.html +505 -0
  108. package/coverage/lib/components/wallet-connect-button/index.html +116 -0
  109. package/coverage/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +805 -0
  110. package/coverage/lib/components/wallet-connect-prompt/index.html +116 -0
  111. package/coverage/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +409 -0
  112. package/coverage/lib/components/wallet-connected-guard/index.html +116 -0
  113. package/coverage/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +304 -0
  114. package/coverage/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +436 -0
  115. package/coverage/lib/components/wallet-connection-modal/connection-method-step/index.html +116 -0
  116. package/coverage/lib/components/wallet-connection-modal/index.html +116 -0
  117. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/index.html +116 -0
  118. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +2287 -0
  119. package/coverage/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +2275 -0
  120. package/coverage/lib/components/wallet-session-display/index.html +116 -0
  121. package/coverage/lib/components/wallet-session-display/wallet-session-display.component.ts.html +676 -0
  122. package/coverage/lib/components/wallet-transaction-status/index.html +116 -0
  123. package/coverage/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +703 -0
  124. package/coverage/lib/directives/index.html +146 -0
  125. package/coverage/lib/directives/wallet-connected.directive.ts.html +670 -0
  126. package/coverage/lib/directives/wallet-context.directive.ts.html +547 -0
  127. package/coverage/lib/directives/wallet-events.directive.ts.html +781 -0
  128. package/coverage/lib/hsuite-wallet.module.ts.html +715 -0
  129. package/coverage/lib/index.html +116 -0
  130. package/coverage/lib/models/connection-config.model.ts.html +280 -0
  131. package/coverage/lib/models/index.html +131 -0
  132. package/coverage/lib/models/provider-types.ts.html +577 -0
  133. package/coverage/lib/providers/base-wallet-provider.ts.html +1138 -0
  134. package/coverage/lib/providers/hsuite-native/channel-client.service.ts.html +2671 -0
  135. package/coverage/lib/providers/hsuite-native/index.html +116 -0
  136. package/coverage/lib/providers/hsuite-native-provider.ts.html +2347 -0
  137. package/coverage/lib/providers/index.html +146 -0
  138. package/coverage/lib/providers/p2p-native/index.html +131 -0
  139. package/coverage/lib/providers/p2p-native/p2p-native.provider.ts.html +2254 -0
  140. package/coverage/lib/providers/p2p-native/p2p-session-manager.ts.html +2170 -0
  141. package/coverage/lib/providers/wallet-error-handler.ts.html +1132 -0
  142. package/coverage/lib/providers/walletconnect/core/index.html +176 -0
  143. package/coverage/lib/providers/walletconnect/core/session-health.ts.html +673 -0
  144. package/coverage/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +1177 -0
  145. package/coverage/lib/providers/walletconnect/core/walletconnect-provider.ts.html +2563 -0
  146. package/coverage/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +904 -0
  147. package/coverage/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +982 -0
  148. package/coverage/lib/providers/walletconnect/signers/hedera-signer.ts.html +1915 -0
  149. package/coverage/lib/providers/walletconnect/signers/index.html +146 -0
  150. package/coverage/lib/providers/walletconnect/signers/signer-factory.ts.html +445 -0
  151. package/coverage/lib/providers/walletconnect/signers/xrpl-signer.ts.html +1519 -0
  152. package/coverage/lib/services/index.html +191 -0
  153. package/coverage/lib/services/logger.service.ts.html +463 -0
  154. package/coverage/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1840 -0
  155. package/coverage/lib/services/transaction-builders/hedera-amount-utils.ts.html +337 -0
  156. package/coverage/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +3940 -0
  157. package/coverage/lib/services/transaction-builders/index.html +161 -0
  158. package/coverage/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +2581 -0
  159. package/coverage/lib/services/transaction.service.ts.html +1123 -0
  160. package/coverage/lib/services/unified-wallet.service.ts.html +2641 -0
  161. package/coverage/lib/services/wallet-context.service.ts.html +637 -0
  162. package/coverage/lib/services/wallet-event-bus.service.ts.html +643 -0
  163. package/coverage/lib/services/wallet-providers.service.ts.html +496 -0
  164. package/coverage/lib/transports/chrome-extension-transport.ts.html +823 -0
  165. package/coverage/lib/transports/index.html +116 -0
  166. package/coverage/lib/utils/index.html +116 -0
  167. package/coverage/lib/utils/ledger-icons.util.ts.html +319 -0
  168. package/coverage/prettify.css +1 -0
  169. package/coverage/prettify.js +2 -0
  170. package/coverage/sort-arrow-sprite.png +0 -0
  171. package/coverage/sorter.js +210 -0
  172. package/dist/README.md +48 -0
  173. package/dist/fesm2022/hsuite-native-connect-angular.mjs +14592 -0
  174. package/dist/fesm2022/hsuite-native-connect-angular.mjs.map +1 -0
  175. package/dist/index.d.ts +6949 -0
  176. package/examples/minimal-connect.ts +178 -0
  177. package/examples/multi-protocol.ts +495 -0
  178. package/examples/transaction-signing.ts +361 -0
  179. package/jest.config.json +45 -0
  180. package/karma.conf.js +42 -0
  181. package/ng-package.json +20 -0
  182. package/package.json +60 -0
  183. package/src/index.ts +203 -0
  184. package/src/lib/components/account-selector/account-actions/account-actions.component.ts +261 -0
  185. package/src/lib/components/account-selector/account-filter/account-filter.component.ts +401 -0
  186. package/src/lib/components/account-selector/account-formatting.service.ts +200 -0
  187. package/src/lib/components/account-selector/account-grouping.service.ts +227 -0
  188. package/src/lib/components/account-selector/account-list/account-list.component.ts +470 -0
  189. package/src/lib/components/account-selector/account-selector.component.html +135 -0
  190. package/src/lib/components/account-selector/account-selector.component.scss +2039 -0
  191. package/src/lib/components/account-selector/account-selector.component.ts +470 -0
  192. package/src/lib/components/account-selector/account-selector.service.ts +501 -0
  193. package/src/lib/components/wallet-account-display/wallet-account-display.component.html +34 -0
  194. package/src/lib/components/wallet-account-display/wallet-account-display.component.scss +99 -0
  195. package/src/lib/components/wallet-account-display/wallet-account-display.component.ts +140 -0
  196. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.html +14 -0
  197. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.scss +272 -0
  198. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.ts +240 -0
  199. package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.html +24 -0
  200. package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.scss +50 -0
  201. package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts +108 -0
  202. package/src/lib/components/wallet-connected-guard/wallet-connected-guard.component.html +24 -0
  203. package/src/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts +73 -0
  204. package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.html +56 -0
  205. package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.scss +218 -0
  206. package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts +117 -0
  207. package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.html +94 -0
  208. package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.scss +272 -0
  209. package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts +734 -0
  210. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.html +197 -0
  211. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.scss +678 -0
  212. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts +730 -0
  213. package/src/lib/components/wallet-session-display/wallet-session-display.component.html +110 -0
  214. package/src/lib/components/wallet-session-display/wallet-session-display.component.scss +179 -0
  215. package/src/lib/components/wallet-session-display/wallet-session-display.component.ts +197 -0
  216. package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.html +65 -0
  217. package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.scss +254 -0
  218. package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts +206 -0
  219. package/src/lib/directives/wallet-connected.directive.ts +195 -0
  220. package/src/lib/directives/wallet-context.directive.ts +154 -0
  221. package/src/lib/directives/wallet-events.directive.ts +232 -0
  222. package/src/lib/hsuite-wallet.module.ts +210 -0
  223. package/src/lib/models/connection-config.model.ts +65 -0
  224. package/src/lib/models/provider-types.ts +164 -0
  225. package/src/lib/models/unified-account.model.ts +76 -0
  226. package/src/lib/models/wallet-context.model.ts +121 -0
  227. package/src/lib/models/wallet-events.model.ts +158 -0
  228. package/src/lib/providers/base-wallet-provider.ts +351 -0
  229. package/src/lib/providers/hsuite-native/channel-client.service.spec.ts +73 -0
  230. package/src/lib/providers/hsuite-native/channel-client.service.ts +862 -0
  231. package/src/lib/providers/hsuite-native/index.ts +8 -0
  232. package/src/lib/providers/hsuite-native-provider.ts +754 -0
  233. package/src/lib/providers/mobile-native/mobile-native.provider.spec.ts +19 -0
  234. package/src/lib/providers/p2p-native/index.ts +30 -0
  235. package/src/lib/providers/p2p-native/p2p-native.provider.spec.ts +523 -0
  236. package/src/lib/providers/p2p-native/p2p-native.provider.ts +723 -0
  237. package/src/lib/providers/p2p-native/p2p-session-manager.ts +695 -0
  238. package/src/lib/providers/wallet-error-handler.ts +349 -0
  239. package/src/lib/providers/walletconnect/core/base-signer.interface.ts +122 -0
  240. package/src/lib/providers/walletconnect/core/session-health.ts +196 -0
  241. package/src/lib/providers/walletconnect/core/walletconnect-client-manager.ts +364 -0
  242. package/src/lib/providers/walletconnect/core/walletconnect-provider.integration.spec.ts +348 -0
  243. package/src/lib/providers/walletconnect/core/walletconnect-provider.ts +826 -0
  244. package/src/lib/providers/walletconnect/core/walletconnect-session-store.ts +273 -0
  245. package/src/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts +299 -0
  246. package/src/lib/providers/walletconnect/core/walletconnect-types.ts +48 -0
  247. package/src/lib/providers/walletconnect/index.ts +33 -0
  248. package/src/lib/providers/walletconnect/signers/hedera-signer.spec.ts +367 -0
  249. package/src/lib/providers/walletconnect/signers/hedera-signer.ts +610 -0
  250. package/src/lib/providers/walletconnect/signers/signer-factory.spec.ts +62 -0
  251. package/src/lib/providers/walletconnect/signers/signer-factory.ts +120 -0
  252. package/src/lib/providers/walletconnect/signers/xrpl-signer.spec.ts +296 -0
  253. package/src/lib/providers/walletconnect/signers/xrpl-signer.ts +478 -0
  254. package/src/lib/services/logger.service.ts +126 -0
  255. package/src/lib/services/transaction-builders/base-transaction-builder.service.ts +585 -0
  256. package/src/lib/services/transaction-builders/hedera-amount-utils.ts +84 -0
  257. package/src/lib/services/transaction-builders/hedera-transaction-builder.service.spec.ts +741 -0
  258. package/src/lib/services/transaction-builders/hedera-transaction-builder.service.ts +1285 -0
  259. package/src/lib/services/transaction-builders/index.ts +54 -0
  260. package/src/lib/services/transaction-builders/xrpl-transaction-builder.service.spec.ts +937 -0
  261. package/src/lib/services/transaction-builders/xrpl-transaction-builder.service.ts +832 -0
  262. package/src/lib/services/transaction.service.ts +346 -0
  263. package/src/lib/services/unified-wallet.service.spec.ts +1382 -0
  264. package/src/lib/services/unified-wallet.service.ts +852 -0
  265. package/src/lib/services/wallet-context.service.ts +184 -0
  266. package/src/lib/services/wallet-event-bus.service.ts +186 -0
  267. package/src/lib/services/wallet-providers.service.ts +137 -0
  268. package/src/lib/transports/chrome-extension-transport.ts +246 -0
  269. package/src/lib/utils/index.ts +14 -0
  270. package/src/lib/utils/ledger-icons.util.ts +78 -0
  271. package/test/test-setup.ts +21 -0
  272. package/test-setup.ts +63 -0
  273. package/tsconfig.build.json +11 -0
  274. package/tsconfig.json +29 -0
  275. package/tsconfig.spec.json +15 -0
  276. package/vitest.config.ts +48 -0
@@ -0,0 +1,246 @@
1
+ /**
2
+ * HSuite Native Connect
3
+ * Copyright 2024-2025 HSuite (https://hsuite.finance)
4
+ *
5
+ * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
6
+ *
7
+ * This file is part of HSuite Native Connect. For commercial licensing,
8
+ * visit https://hsuite.finance/licensing
9
+ */
10
+
11
+ /**
12
+ * @file chrome-extension-transport.ts
13
+ * @description
14
+ * Transport implementation for communicating with HSuite Wallet Chrome Extension.
15
+ *
16
+ * This transport uses chrome.runtime.sendMessage() to communicate with the
17
+ * extension's background service worker, which then routes messages to the wallet.
18
+ */
19
+
20
+ import { getLogger } from '@hsuite/native-connect-sdk';
21
+ import type { TransportProvider } from '@hsuite/native-connect-sdk';
22
+ import type { MessageEnvelope } from '@hsuite/native-connect-types';
23
+
24
+ const logger = getLogger().scoped?.('ChromeExtensionTransport') ?? getLogger();
25
+
26
+ /**
27
+ * @interface ChromeExtensionTransportOptions
28
+ * Configuration options for Chrome Extension transport
29
+ */
30
+ export interface ChromeExtensionTransportOptions {
31
+ /**
32
+ * Unique identifier for this transport instance
33
+ */
34
+ id: string;
35
+ }
36
+
37
+ /**
38
+ * @class ChromeExtensionTransport
39
+ *
40
+ * Transport layer for dApps to communicate with HSuite Wallet Chrome Extension.
41
+ *
42
+ * **How it works:**
43
+ * 1. dApp sends message via window.postMessage() to same-origin
44
+ * 2. Extension's content script listens and forwards to background via chrome.runtime
45
+ * 3. Background processes request and sends response back
46
+ * 4. Response flows back: background → content script → dApp
47
+ *
48
+ * **Important**: The dApp NEVER directly accesses chrome.runtime. Only the
49
+ * extension's content script has chrome.runtime access.
50
+ *
51
+ * **Advantages over window-based transport:**
52
+ * - No popup windows required
53
+ * - Faster communication (no cross-window messaging)
54
+ * - Better UX (uses extension popup/sidebar)
55
+ * - Works across all tabs
56
+ *
57
+ * **Detection:**
58
+ * The extension injects `window.__HSUITE_WALLET_EXTENSION__` flag that dApps
59
+ * can check before attempting to use this transport.
60
+ */
61
+ export class ChromeExtensionTransport implements TransportProvider {
62
+ private readonly transportId: string;
63
+ private listeners = new Set<(message: MessageEnvelope<unknown>) => void>();
64
+ private disconnectHandler?: (reason?: any) => void;
65
+ private isConnected = false;
66
+ private messageHandler?: (event: MessageEvent) => void;
67
+
68
+ /**
69
+ *
70
+ * @param options
71
+ */
72
+ constructor(private readonly options: ChromeExtensionTransportOptions) {
73
+ this.transportId = options.id;
74
+ }
75
+
76
+ /**
77
+ *
78
+ */
79
+ get id(): string {
80
+ return this.transportId;
81
+ }
82
+
83
+ /**
84
+ * Connect to the extension. Sets up message listeners.
85
+ *
86
+ * NOTE: dApps communicate with extensions via window.postMessage() to the
87
+ * content script. The dApp NEVER directly accesses chrome.runtime - only
88
+ * the extension's content script has access to chrome.runtime.
89
+ *
90
+ * Flow: dApp (window.postMessage) → Content Script (chrome.runtime) → Background
91
+ */
92
+ async connect(): Promise<void> {
93
+ if (this.isConnected) {
94
+ logger.warn('Already connected', { id: this.transportId });
95
+ return;
96
+ }
97
+
98
+ // Set up window.postMessage listener for content script communication
99
+ logger.info('Connecting to extension via window.postMessage', { id: this.transportId });
100
+ this.setupWindowListener();
101
+
102
+ this.isConnected = true;
103
+ logger.info('Connected to extension', { id: this.transportId });
104
+ }
105
+
106
+ /**
107
+ * Send a message to the extension via window.postMessage
108
+ * @param message
109
+ */
110
+ async send(message: MessageEnvelope<unknown>): Promise<void> {
111
+ if (!this.isConnected) {
112
+ throw new Error('Transport not connected');
113
+ }
114
+
115
+ logger.debug('Sending message to extension via postMessage', {
116
+ id: this.transportId,
117
+ topic: message.topic,
118
+ method: (message.payload as { method?: string })?.method,
119
+ });
120
+
121
+ // Send to content script via postMessage
122
+ window.postMessage(message, window.location.origin);
123
+ logger.debug('Message posted to content script', { id: this.transportId });
124
+ }
125
+
126
+ /**
127
+ * Register a message listener
128
+ * @param listener
129
+ */
130
+ onMessage<TPayload = unknown>(listener: (message: MessageEnvelope<TPayload>) => void): void {
131
+ this.listeners.add(listener as (message: MessageEnvelope<unknown>) => void);
132
+ }
133
+
134
+ /**
135
+ * Register a disconnect listener
136
+ * @param handler
137
+ */
138
+ onDisconnect(handler: (reason?: any) => void): void {
139
+ this.disconnectHandler = handler;
140
+ }
141
+
142
+ /**
143
+ * Disconnect from the extension
144
+ */
145
+ async disconnect(): Promise<void> {
146
+ if (!this.isConnected) {
147
+ return;
148
+ }
149
+
150
+ // Remove window message listener
151
+ if (this.messageHandler) {
152
+ window.removeEventListener('message', this.messageHandler);
153
+ this.messageHandler = undefined;
154
+ }
155
+
156
+ this.listeners.clear();
157
+ this.isConnected = false;
158
+
159
+ logger.info('Disconnected from extension', { id: this.transportId });
160
+ this.disconnectHandler?.();
161
+ }
162
+
163
+ // ========== PRIVATE METHODS ==========
164
+
165
+ /**
166
+ * Set up listener for messages from content script via window.postMessage
167
+ */
168
+ private setupWindowListener(): void {
169
+ this.messageHandler = (event: MessageEvent) => {
170
+ if (!this.isConnected) {
171
+ return;
172
+ }
173
+
174
+ // Only process messages from same origin
175
+ if (event.origin !== window.location.origin) {
176
+ return;
177
+ }
178
+
179
+ // Only process RPC envelopes
180
+ const message = event.data;
181
+ if (!message || typeof message !== 'object' || message.topic !== 'rpc') {
182
+ return;
183
+ }
184
+
185
+ logger.debug('Received message from content script', {
186
+ id: this.transportId,
187
+ method: message.payload?.method,
188
+ });
189
+
190
+ // Deliver to all listeners
191
+ for (const listener of this.listeners) {
192
+ try {
193
+ listener(message);
194
+ } catch (error) {
195
+ logger.error('Listener failed', { error });
196
+ }
197
+ }
198
+ };
199
+
200
+ window.addEventListener('message', this.messageHandler);
201
+ }
202
+ }
203
+
204
+ /**
205
+ * @function isExtensionInstalled
206
+ *
207
+ * Check if HSuite Wallet extension is installed.
208
+ *
209
+ * The extension's content script injects a flag into the page that can be
210
+ * checked to determine if the extension is available.
211
+ *
212
+ * **IMPORTANT**: The dApp (web page) does NOT have access to chrome.runtime -
213
+ * only the extension's content script does. The dApp communicates with the
214
+ * extension via window.postMessage() → content script → chrome.runtime.
215
+ *
216
+ * @returns true if extension is installed and active
217
+ */
218
+ export function isExtensionInstalled(): boolean {
219
+ if (typeof window === 'undefined') {
220
+ return false;
221
+ }
222
+
223
+ // Simply check if the extension injected its flag
224
+ // The flag is set by inject-flags.ts which runs in MAIN world
225
+ return (
226
+ (window as any as { __HSUITE_WALLET_EXTENSION__?: boolean }).__HSUITE_WALLET_EXTENSION__ ===
227
+ true
228
+ );
229
+ }
230
+
231
+ /**
232
+ * @function getExtensionVersion
233
+ *
234
+ * Get the version of the installed HSuite Wallet extension.
235
+ *
236
+ * @returns Extension version string, or null if not installed
237
+ */
238
+ export function getExtensionVersion(): string | null {
239
+ if (typeof window === 'undefined') {
240
+ return null;
241
+ }
242
+
243
+ return (
244
+ (window as any as { __HSUITE_WALLET_VERSION__?: string }).__HSUITE_WALLET_VERSION__ || null
245
+ );
246
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * HSuite Native Connect
3
+ * Copyright 2024-2025 HSuite (https://hsuite.finance)
4
+ *
5
+ * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
6
+ *
7
+ * This file is part of HSuite Native Connect. For commercial licensing,
8
+ * visit https://hsuite.finance/licensing
9
+ */
10
+
11
+ /**
12
+ * Utility exports for @hsuite/native-connect-angular
13
+ */
14
+ export * from './ledger-icons.util';
@@ -0,0 +1,78 @@
1
+ /**
2
+ * HSuite Native Connect
3
+ * Copyright 2024-2025 HSuite (https://hsuite.finance)
4
+ *
5
+ * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
6
+ *
7
+ * This file is part of HSuite Native Connect. For commercial licensing,
8
+ * visit https://hsuite.finance/licensing
9
+ */
10
+
11
+ /**
12
+ * @module LedgerIconsUtil
13
+ * Utilities for getting default icon URLs for ledgers and their native tokens.
14
+ *
15
+ * Uses CoinGecko's public CDN for reliable, high-quality token icons.
16
+ * Shared across wallet and dApp for consistency.
17
+ */
18
+
19
+ /**
20
+ * Default icon URLs for native ledger tokens
21
+ */
22
+ export const DEFAULT_LEDGER_ICONS: Record<string, string> = {
23
+ hedera: 'https://assets.coingecko.com/coins/images/3688/standard/hbar.png?1696504364',
24
+ xrpl: 'https://assets.coingecko.com/coins/images/44/standard/xrp-symbol-white-128.png?1696501442',
25
+ };
26
+
27
+ /**
28
+ * Brand colors for each ledger
29
+ */
30
+ export const LEDGER_COLORS: Record<string, string> = {
31
+ hedera: '#8259ef',
32
+ xrpl: '#23292f',
33
+ };
34
+
35
+ /**
36
+ * Display names for each ledger
37
+ */
38
+ export const LEDGER_NAMES: Record<string, string> = {
39
+ hedera: 'Hedera',
40
+ xrpl: 'XRP Ledger',
41
+ };
42
+
43
+ /**
44
+ * Get the default icon URL for a ledger
45
+ * @param ledgerId - Ledger identifier (e.g., 'hedera', 'xrpl')
46
+ * @returns Icon URL or empty string if not found
47
+ */
48
+ export function getLedgerIcon(ledgerId: string): string {
49
+ return DEFAULT_LEDGER_ICONS[ledgerId?.toLowerCase()] || '';
50
+ }
51
+
52
+ /**
53
+ * Get the brand color for a ledger
54
+ * @param ledgerId - Ledger identifier
55
+ * @returns Hex color string or primary color fallback
56
+ */
57
+ export function getLedgerColor(ledgerId: string): string {
58
+ return LEDGER_COLORS[ledgerId?.toLowerCase()] || 'var(--ion-color-primary)';
59
+ }
60
+
61
+ /**
62
+ * Get the display name for a ledger
63
+ * @param ledgerId - Ledger identifier
64
+ * @returns Human-readable ledger name
65
+ */
66
+ export function getLedgerName(ledgerId: string): string {
67
+ return LEDGER_NAMES[ledgerId?.toLowerCase()] || ledgerId;
68
+ }
69
+
70
+ /**
71
+ * Get token icon URL, falling back to ledger default if not provided
72
+ * @param tokenIconUrl - Specific token icon URL (optional)
73
+ * @param ledgerId - Ledger identifier for fallback
74
+ * @returns Icon URL or empty string
75
+ */
76
+ export function getTokenIcon(tokenIconUrl: string | undefined, ledgerId: string): string {
77
+ return tokenIconUrl || getLedgerIcon(ledgerId);
78
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * HSuite Native Connect
3
+ * Copyright 2024-2025 HSuite (https://hsuite.finance)
4
+ *
5
+ * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
6
+ *
7
+ * This file is part of HSuite Native Connect. For commercial licensing,
8
+ * visit https://hsuite.finance/licensing
9
+ */
10
+
11
+ // This file is required by karma.conf.js and loads recursively all the .spec files
12
+ import 'zone.js';
13
+ import 'zone.js/testing';
14
+ import { getTestBed } from '@angular/core/testing';
15
+ import {
16
+ BrowserDynamicTestingModule,
17
+ platformBrowserDynamicTesting,
18
+ } from '@angular/platform-browser-dynamic/testing';
19
+
20
+ // First, initialize the Angular testing environment.
21
+ getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting());
package/test-setup.ts ADDED
@@ -0,0 +1,63 @@
1
+ /**
2
+ * HSuite Native Connect
3
+ * Copyright 2024-2025 HSuite (https://hsuite.finance)
4
+ *
5
+ * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
6
+ *
7
+ * This file is part of HSuite Native Connect. For commercial licensing,
8
+ * visit https://hsuite.finance/licensing
9
+ */
10
+
11
+ /**
12
+ * Test setup for Angular SDK
13
+ *
14
+ * This file sets up the test environment for Vitest.
15
+ * It initializes Angular's TestBed and provides mocks for browser APIs.
16
+ */
17
+
18
+ import 'zone.js';
19
+ import 'zone.js/testing';
20
+
21
+ import { getTestBed } from '@angular/core/testing';
22
+ import {
23
+ BrowserDynamicTestingModule,
24
+ platformBrowserDynamicTesting,
25
+ } from '@angular/platform-browser-dynamic/testing';
26
+ import { vi } from 'vitest';
27
+
28
+ // Initialize Angular test environment
29
+ getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting());
30
+
31
+ // Mock window.matchMedia for responsive tests
32
+ Object.defineProperty(window, 'matchMedia', {
33
+ writable: true,
34
+ value: (query: string) => ({
35
+ matches: false,
36
+ media: query,
37
+ onchange: null,
38
+ addListener: vi.fn(),
39
+ removeListener: vi.fn(),
40
+ addEventListener: vi.fn(),
41
+ removeEventListener: vi.fn(),
42
+ dispatchEvent: vi.fn(() => true),
43
+ }),
44
+ });
45
+
46
+ // Mock crypto if not available
47
+ if (typeof window !== 'undefined' && !window.crypto) {
48
+ (window as { crypto: unknown }).crypto = {
49
+ getRandomValues: (arr: Uint8Array) => {
50
+ for (let i = 0; i < arr.length; i++) {
51
+ arr[i] = Math.floor(Math.random() * 256);
52
+ }
53
+ return arr;
54
+ },
55
+ randomUUID: () => {
56
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
57
+ const r = (Math.random() * 16) | 0;
58
+ const v = c === 'x' ? r : (r & 0x3) | 0x8;
59
+ return v.toString(16);
60
+ });
61
+ },
62
+ };
63
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "declaration": true,
6
+ "declarationMap": true
7
+ },
8
+ "include": ["src/**/*.ts"],
9
+ "exclude": ["**/*.spec.ts", "**/*.test.ts"]
10
+ }
11
+
package/tsconfig.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "target": "ES2022",
5
+ "module": "ES2022",
6
+ "lib": ["ES2022", "DOM"],
7
+ "moduleResolution": "node",
8
+ "declaration": true,
9
+ "declarationMap": true,
10
+ "sourceMap": true,
11
+ "outDir": "./dist",
12
+ "rootDir": "./src",
13
+ "strict": true,
14
+ "esModuleInterop": true,
15
+ "skipLibCheck": true,
16
+ "forceConsistentCasingInFileNames": true,
17
+ "experimentalDecorators": true,
18
+ "emitDecoratorMetadata": true,
19
+ "allowSyntheticDefaultImports": true,
20
+ "types": ["jasmine", "node"]
21
+ },
22
+ "angularCompilerOptions": {
23
+ "skipLibCheck": true,
24
+ "strictTemplates": false
25
+ },
26
+ "include": ["src/**/*.ts"],
27
+ "exclude": ["node_modules", "dist", "**/*.spec.ts"]
28
+ }
29
+
@@ -0,0 +1,15 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./out-tsc/spec",
5
+ "types": [
6
+ "jasmine",
7
+ "node"
8
+ ]
9
+ },
10
+ "include": [
11
+ "test/**/*.spec.ts",
12
+ "test/**/*.d.ts"
13
+ ]
14
+ }
15
+
@@ -0,0 +1,48 @@
1
+ /**
2
+ * HSuite Native Connect
3
+ * Copyright 2024-2025 HSuite (https://hsuite.finance)
4
+ *
5
+ * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
6
+ *
7
+ * This file is part of HSuite Native Connect. For commercial licensing,
8
+ * visit https://hsuite.finance/licensing
9
+ */
10
+
11
+ import { defineConfig } from 'vitest/config';
12
+ import path from 'path';
13
+
14
+ export default defineConfig({
15
+ resolve: {
16
+ alias: {
17
+ // Force vitest to resolve to source files, not dist
18
+ '@hsuite/native-connect-angular': path.resolve(__dirname, 'src/index.ts'),
19
+ },
20
+ },
21
+ test: {
22
+ environment: 'jsdom',
23
+ globals: true,
24
+ include: ['src/**/*.spec.ts'],
25
+ setupFiles: ['./test-setup.ts'],
26
+ deps: {
27
+ inline: [/@angular/, /@ionic/, /@ngneat/, /@walletconnect/],
28
+ },
29
+ server: {
30
+ deps: {
31
+ inline: [/@angular/, /@ionic/, /@ngneat/, /@walletconnect/],
32
+ },
33
+ },
34
+ coverage: {
35
+ enabled: true,
36
+ provider: 'v8',
37
+ reporter: ['text', 'lcov', 'html', 'json-summary'],
38
+ include: ['src/**/*.ts'],
39
+ // Angular services require TestBed for proper testing - current coverage reflects
40
+ // tested providers and transaction builders; other services need integration tests
41
+ statements: 30,
42
+ branches: 60,
43
+ functions: 60,
44
+ lines: 30,
45
+ exclude: ['**/node_modules/**', '**/dist/**', '**/*.spec.ts', '**/index.ts'],
46
+ },
47
+ },
48
+ });