@hsuite/native-connect-angular 1.0.0 → 2.1.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 (162) hide show
  1. package/coverage/coverage-summary.json +49 -49
  2. package/coverage/index.html +122 -122
  3. package/coverage/lcov-report/index.html +122 -122
  4. package/coverage/lcov-report/lib/components/account-selector/account-actions/account-actions.component.ts.html +1 -1
  5. package/coverage/lcov-report/lib/components/account-selector/account-actions/index.html +1 -1
  6. package/coverage/lcov-report/lib/components/account-selector/account-filter/account-filter.component.ts.html +1 -1
  7. package/coverage/lcov-report/lib/components/account-selector/account-filter/index.html +1 -1
  8. package/coverage/lcov-report/lib/components/account-selector/account-formatting.service.ts.html +1 -1
  9. package/coverage/lcov-report/lib/components/account-selector/account-grouping.service.ts.html +1 -1
  10. package/coverage/lcov-report/lib/components/account-selector/account-list/account-list.component.ts.html +1 -1
  11. package/coverage/lcov-report/lib/components/account-selector/account-list/index.html +1 -1
  12. package/coverage/lcov-report/lib/components/account-selector/account-selector.component.ts.html +1 -1
  13. package/coverage/lcov-report/lib/components/account-selector/account-selector.service.ts.html +1 -1
  14. package/coverage/lcov-report/lib/components/account-selector/index.html +1 -1
  15. package/coverage/lcov-report/lib/components/wallet-account-display/index.html +1 -1
  16. package/coverage/lcov-report/lib/components/wallet-account-display/wallet-account-display.component.ts.html +1 -1
  17. package/coverage/lcov-report/lib/components/wallet-connect-button/index.html +21 -21
  18. package/coverage/lcov-report/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +475 -451
  19. package/coverage/lcov-report/lib/components/wallet-connect-prompt/index.html +1 -1
  20. package/coverage/lcov-report/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +1 -1
  21. package/coverage/lcov-report/lib/components/wallet-connected-guard/index.html +1 -1
  22. package/coverage/lcov-report/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +1 -1
  23. package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +148 -148
  24. package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/index.html +17 -17
  25. package/coverage/lcov-report/lib/components/wallet-connection-modal/index.html +21 -21
  26. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/index.html +17 -17
  27. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +838 -838
  28. package/coverage/lcov-report/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +1182 -987
  29. package/coverage/lcov-report/lib/components/wallet-session-display/index.html +1 -1
  30. package/coverage/lcov-report/lib/components/wallet-session-display/wallet-session-display.component.ts.html +1 -1
  31. package/coverage/lcov-report/lib/components/wallet-transaction-status/index.html +1 -1
  32. package/coverage/lcov-report/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +1 -1
  33. package/coverage/lcov-report/lib/directives/index.html +1 -1
  34. package/coverage/lcov-report/lib/directives/wallet-connected.directive.ts.html +1 -1
  35. package/coverage/lcov-report/lib/directives/wallet-context.directive.ts.html +1 -1
  36. package/coverage/lcov-report/lib/directives/wallet-events.directive.ts.html +1 -1
  37. package/coverage/lcov-report/lib/hsuite-wallet.module.ts.html +1 -1
  38. package/coverage/lcov-report/lib/index.html +1 -1
  39. package/coverage/lcov-report/lib/models/connection-config.model.ts.html +1 -1
  40. package/coverage/lcov-report/lib/models/index.html +1 -1
  41. package/coverage/lcov-report/lib/models/provider-types.ts.html +1 -1
  42. package/coverage/lcov-report/lib/providers/base-wallet-provider.ts.html +20 -20
  43. package/coverage/lcov-report/lib/providers/hsuite-native/channel-client.service.ts.html +637 -637
  44. package/coverage/lcov-report/lib/providers/hsuite-native/index.html +19 -19
  45. package/coverage/lcov-report/lib/providers/hsuite-native-provider.ts.html +1 -1
  46. package/coverage/lcov-report/lib/providers/index.html +18 -18
  47. package/coverage/lcov-report/lib/providers/p2p-native/index.html +20 -20
  48. package/coverage/lcov-report/lib/providers/p2p-native/p2p-native.provider.ts.html +993 -993
  49. package/coverage/lcov-report/lib/providers/p2p-native/p2p-session-manager.ts.html +1 -1
  50. package/coverage/lcov-report/lib/providers/wallet-error-handler.ts.html +1 -1
  51. package/coverage/lcov-report/lib/providers/walletconnect/core/index.html +65 -65
  52. package/coverage/lcov-report/lib/providers/walletconnect/core/session-health.ts.html +240 -240
  53. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +559 -559
  54. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-provider.ts.html +1104 -1104
  55. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +493 -493
  56. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +366 -366
  57. package/coverage/lcov-report/lib/providers/walletconnect/signers/hedera-signer.ts.html +730 -730
  58. package/coverage/lcov-report/lib/providers/walletconnect/signers/index.html +43 -43
  59. package/coverage/lcov-report/lib/providers/walletconnect/signers/signer-factory.ts.html +234 -234
  60. package/coverage/lcov-report/lib/providers/walletconnect/signers/xrpl-signer.ts.html +650 -650
  61. package/coverage/lcov-report/lib/services/index.html +31 -31
  62. package/coverage/lcov-report/lib/services/logger.service.ts.html +4 -4
  63. package/coverage/lcov-report/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1 -1
  64. package/coverage/lcov-report/lib/services/transaction-builders/hedera-amount-utils.ts.html +155 -155
  65. package/coverage/lcov-report/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +2156 -2156
  66. package/coverage/lcov-report/lib/services/transaction-builders/index.html +43 -43
  67. package/coverage/lcov-report/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +1674 -1674
  68. package/coverage/lcov-report/lib/services/transaction.service.ts.html +4 -7
  69. package/coverage/lcov-report/lib/services/unified-wallet.service.ts.html +7 -10
  70. package/coverage/lcov-report/lib/services/wallet-context.service.ts.html +1 -1
  71. package/coverage/lcov-report/lib/services/wallet-event-bus.service.ts.html +249 -249
  72. package/coverage/lcov-report/lib/services/wallet-providers.service.ts.html +4 -7
  73. package/coverage/lcov-report/lib/transports/chrome-extension-transport.ts.html +1 -1
  74. package/coverage/lcov-report/lib/transports/index.html +1 -1
  75. package/coverage/lcov-report/lib/utils/index.html +1 -1
  76. package/coverage/lcov-report/lib/utils/ledger-icons.util.ts.html +1 -1
  77. package/coverage/lcov.info +14420 -14977
  78. package/coverage/lib/components/account-selector/account-actions/account-actions.component.ts.html +1 -1
  79. package/coverage/lib/components/account-selector/account-actions/index.html +1 -1
  80. package/coverage/lib/components/account-selector/account-filter/account-filter.component.ts.html +1 -1
  81. package/coverage/lib/components/account-selector/account-filter/index.html +1 -1
  82. package/coverage/lib/components/account-selector/account-formatting.service.ts.html +1 -1
  83. package/coverage/lib/components/account-selector/account-grouping.service.ts.html +1 -1
  84. package/coverage/lib/components/account-selector/account-list/account-list.component.ts.html +1 -1
  85. package/coverage/lib/components/account-selector/account-list/index.html +1 -1
  86. package/coverage/lib/components/account-selector/account-selector.component.ts.html +1 -1
  87. package/coverage/lib/components/account-selector/account-selector.service.ts.html +1 -1
  88. package/coverage/lib/components/account-selector/index.html +1 -1
  89. package/coverage/lib/components/wallet-account-display/index.html +1 -1
  90. package/coverage/lib/components/wallet-account-display/wallet-account-display.component.ts.html +1 -1
  91. package/coverage/lib/components/wallet-connect-button/index.html +21 -21
  92. package/coverage/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +475 -451
  93. package/coverage/lib/components/wallet-connect-prompt/index.html +1 -1
  94. package/coverage/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +1 -1
  95. package/coverage/lib/components/wallet-connected-guard/index.html +1 -1
  96. package/coverage/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +1 -1
  97. package/coverage/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +148 -148
  98. package/coverage/lib/components/wallet-connection-modal/connection-method-step/index.html +17 -17
  99. package/coverage/lib/components/wallet-connection-modal/index.html +21 -21
  100. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/index.html +17 -17
  101. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +838 -838
  102. package/coverage/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +1182 -987
  103. package/coverage/lib/components/wallet-session-display/index.html +1 -1
  104. package/coverage/lib/components/wallet-session-display/wallet-session-display.component.ts.html +1 -1
  105. package/coverage/lib/components/wallet-transaction-status/index.html +1 -1
  106. package/coverage/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +1 -1
  107. package/coverage/lib/directives/index.html +1 -1
  108. package/coverage/lib/directives/wallet-connected.directive.ts.html +1 -1
  109. package/coverage/lib/directives/wallet-context.directive.ts.html +1 -1
  110. package/coverage/lib/directives/wallet-events.directive.ts.html +1 -1
  111. package/coverage/lib/hsuite-wallet.module.ts.html +1 -1
  112. package/coverage/lib/index.html +1 -1
  113. package/coverage/lib/models/connection-config.model.ts.html +1 -1
  114. package/coverage/lib/models/index.html +1 -1
  115. package/coverage/lib/models/provider-types.ts.html +1 -1
  116. package/coverage/lib/providers/base-wallet-provider.ts.html +20 -20
  117. package/coverage/lib/providers/hsuite-native/channel-client.service.ts.html +637 -637
  118. package/coverage/lib/providers/hsuite-native/index.html +19 -19
  119. package/coverage/lib/providers/hsuite-native-provider.ts.html +1 -1
  120. package/coverage/lib/providers/index.html +18 -18
  121. package/coverage/lib/providers/p2p-native/index.html +20 -20
  122. package/coverage/lib/providers/p2p-native/p2p-native.provider.ts.html +993 -993
  123. package/coverage/lib/providers/p2p-native/p2p-session-manager.ts.html +1 -1
  124. package/coverage/lib/providers/wallet-error-handler.ts.html +1 -1
  125. package/coverage/lib/providers/walletconnect/core/index.html +65 -65
  126. package/coverage/lib/providers/walletconnect/core/session-health.ts.html +240 -240
  127. package/coverage/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +559 -559
  128. package/coverage/lib/providers/walletconnect/core/walletconnect-provider.ts.html +1104 -1104
  129. package/coverage/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +493 -493
  130. package/coverage/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +366 -366
  131. package/coverage/lib/providers/walletconnect/signers/hedera-signer.ts.html +730 -730
  132. package/coverage/lib/providers/walletconnect/signers/index.html +43 -43
  133. package/coverage/lib/providers/walletconnect/signers/signer-factory.ts.html +234 -234
  134. package/coverage/lib/providers/walletconnect/signers/xrpl-signer.ts.html +650 -650
  135. package/coverage/lib/services/index.html +31 -31
  136. package/coverage/lib/services/logger.service.ts.html +4 -4
  137. package/coverage/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1 -1
  138. package/coverage/lib/services/transaction-builders/hedera-amount-utils.ts.html +155 -155
  139. package/coverage/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +2156 -2156
  140. package/coverage/lib/services/transaction-builders/index.html +43 -43
  141. package/coverage/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +1674 -1674
  142. package/coverage/lib/services/transaction.service.ts.html +4 -7
  143. package/coverage/lib/services/unified-wallet.service.ts.html +7 -10
  144. package/coverage/lib/services/wallet-context.service.ts.html +1 -1
  145. package/coverage/lib/services/wallet-event-bus.service.ts.html +249 -249
  146. package/coverage/lib/services/wallet-providers.service.ts.html +4 -7
  147. package/coverage/lib/transports/chrome-extension-transport.ts.html +1 -1
  148. package/coverage/lib/transports/index.html +1 -1
  149. package/coverage/lib/utils/index.html +1 -1
  150. package/coverage/lib/utils/ledger-icons.util.ts.html +1 -1
  151. package/dist/fesm2022/hsuite-native-connect-angular.mjs +85 -20
  152. package/dist/fesm2022/hsuite-native-connect-angular.mjs.map +1 -1
  153. package/dist/index.d.ts +33 -3
  154. package/package.json +4 -4
  155. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.spec.ts +89 -0
  156. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.ts +8 -0
  157. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.html +1 -6
  158. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.spec.ts +173 -0
  159. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts +84 -19
  160. package/src/lib/services/transaction.service.ts +0 -1
  161. package/src/lib/services/unified-wallet.service.ts +0 -1
  162. package/src/lib/services/wallet-providers.service.ts +0 -1
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">36.42% </span>
26
+ <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>314/862</span>
28
+ <span class='fraction'>0/862</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">50% </span>
33
+ <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>3/6</span>
35
+ <span class='fraction'>0/1</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">18.75% </span>
40
+ <span class="strong">0% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>3/16</span>
42
+ <span class='fraction'>0/1</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">36.42% </span>
47
+ <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>314/862</span>
49
+ <span class='fraction'>0/862</span>
50
50
  </div>
51
51
 
52
52
 
@@ -925,169 +925,9 @@
925
925
  <a name='L860'></a><a href='#L860'>860</a>
926
926
  <a name='L861'></a><a href='#L861'>861</a>
927
927
  <a name='L862'></a><a href='#L862'>862</a>
928
- <a name='L863'></a><a href='#L863'>863</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
929
- <span class="cline-any cline-yes">1x</span>
930
- <span class="cline-any cline-yes">1x</span>
931
- <span class="cline-any cline-yes">1x</span>
932
- <span class="cline-any cline-yes">1x</span>
933
- <span class="cline-any cline-yes">1x</span>
934
- <span class="cline-any cline-yes">1x</span>
935
- <span class="cline-any cline-yes">1x</span>
936
- <span class="cline-any cline-yes">1x</span>
937
- <span class="cline-any cline-yes">1x</span>
938
- <span class="cline-any cline-yes">1x</span>
939
- <span class="cline-any cline-yes">1x</span>
940
- <span class="cline-any cline-yes">1x</span>
941
- <span class="cline-any cline-yes">1x</span>
942
- <span class="cline-any cline-yes">1x</span>
943
- <span class="cline-any cline-yes">1x</span>
944
- <span class="cline-any cline-yes">1x</span>
945
- <span class="cline-any cline-yes">1x</span>
946
- <span class="cline-any cline-yes">1x</span>
947
- <span class="cline-any cline-yes">1x</span>
948
- <span class="cline-any cline-yes">1x</span>
949
- <span class="cline-any cline-yes">1x</span>
950
- <span class="cline-any cline-yes">1x</span>
951
- <span class="cline-any cline-yes">1x</span>
952
- <span class="cline-any cline-yes">1x</span>
953
- <span class="cline-any cline-yes">1x</span>
954
- <span class="cline-any cline-yes">1x</span>
955
- <span class="cline-any cline-yes">1x</span>
956
- <span class="cline-any cline-yes">1x</span>
957
- <span class="cline-any cline-yes">1x</span>
958
- <span class="cline-any cline-yes">1x</span>
959
- <span class="cline-any cline-yes">1x</span>
960
- <span class="cline-any cline-yes">1x</span>
961
- <span class="cline-any cline-yes">1x</span>
962
- <span class="cline-any cline-yes">1x</span>
963
- <span class="cline-any cline-yes">1x</span>
964
- <span class="cline-any cline-yes">1x</span>
965
- <span class="cline-any cline-yes">1x</span>
966
- <span class="cline-any cline-yes">1x</span>
967
- <span class="cline-any cline-yes">1x</span>
968
- <span class="cline-any cline-yes">1x</span>
969
- <span class="cline-any cline-yes">1x</span>
970
- <span class="cline-any cline-yes">1x</span>
971
- <span class="cline-any cline-yes">1x</span>
972
- <span class="cline-any cline-yes">1x</span>
973
- <span class="cline-any cline-yes">1x</span>
974
- <span class="cline-any cline-yes">1x</span>
975
- <span class="cline-any cline-yes">1x</span>
976
- <span class="cline-any cline-yes">1x</span>
977
- <span class="cline-any cline-yes">1x</span>
978
- <span class="cline-any cline-yes">1x</span>
979
- <span class="cline-any cline-yes">1x</span>
980
- <span class="cline-any cline-yes">1x</span>
981
- <span class="cline-any cline-yes">1x</span>
982
- <span class="cline-any cline-yes">1x</span>
983
- <span class="cline-any cline-yes">1x</span>
984
- <span class="cline-any cline-yes">1x</span>
985
- <span class="cline-any cline-yes">1x</span>
986
- <span class="cline-any cline-yes">1x</span>
987
- <span class="cline-any cline-yes">1x</span>
988
- <span class="cline-any cline-yes">1x</span>
989
- <span class="cline-any cline-yes">1x</span>
990
- <span class="cline-any cline-yes">1x</span>
991
- <span class="cline-any cline-yes">1x</span>
992
- <span class="cline-any cline-yes">1x</span>
993
- <span class="cline-any cline-yes">1x</span>
994
- <span class="cline-any cline-yes">1x</span>
995
- <span class="cline-any cline-yes">1x</span>
996
- <span class="cline-any cline-yes">1x</span>
997
- <span class="cline-any cline-yes">1x</span>
998
- <span class="cline-any cline-yes">1x</span>
999
- <span class="cline-any cline-yes">1x</span>
1000
- <span class="cline-any cline-yes">1x</span>
1001
- <span class="cline-any cline-yes">1x</span>
1002
- <span class="cline-any cline-yes">1x</span>
1003
- <span class="cline-any cline-yes">1x</span>
1004
- <span class="cline-any cline-yes">1x</span>
1005
- <span class="cline-any cline-yes">1x</span>
1006
- <span class="cline-any cline-yes">1x</span>
1007
- <span class="cline-any cline-yes">1x</span>
1008
- <span class="cline-any cline-yes">1x</span>
1009
- <span class="cline-any cline-yes">1x</span>
1010
- <span class="cline-any cline-yes">1x</span>
1011
- <span class="cline-any cline-yes">1x</span>
1012
- <span class="cline-any cline-yes">1x</span>
1013
- <span class="cline-any cline-yes">1x</span>
1014
- <span class="cline-any cline-yes">1x</span>
1015
- <span class="cline-any cline-yes">1x</span>
1016
- <span class="cline-any cline-yes">1x</span>
1017
- <span class="cline-any cline-yes">1x</span>
1018
- <span class="cline-any cline-yes">1x</span>
1019
- <span class="cline-any cline-yes">1x</span>
1020
- <span class="cline-any cline-yes">1x</span>
1021
- <span class="cline-any cline-yes">1x</span>
1022
- <span class="cline-any cline-yes">1x</span>
1023
- <span class="cline-any cline-yes">1x</span>
1024
- <span class="cline-any cline-yes">1x</span>
1025
- <span class="cline-any cline-yes">1x</span>
1026
- <span class="cline-any cline-yes">1x</span>
1027
- <span class="cline-any cline-yes">1x</span>
1028
- <span class="cline-any cline-yes">1x</span>
1029
- <span class="cline-any cline-yes">1x</span>
1030
- <span class="cline-any cline-yes">1x</span>
1031
- <span class="cline-any cline-yes">1x</span>
1032
- <span class="cline-any cline-yes">1x</span>
1033
- <span class="cline-any cline-yes">1x</span>
1034
- <span class="cline-any cline-yes">1x</span>
1035
- <span class="cline-any cline-yes">1x</span>
1036
- <span class="cline-any cline-yes">1x</span>
1037
- <span class="cline-any cline-yes">1x</span>
1038
- <span class="cline-any cline-yes">1x</span>
1039
- <span class="cline-any cline-yes">1x</span>
1040
- <span class="cline-any cline-yes">1x</span>
1041
- <span class="cline-any cline-yes">1x</span>
1042
- <span class="cline-any cline-yes">1x</span>
1043
- <span class="cline-any cline-yes">1x</span>
1044
- <span class="cline-any cline-yes">1x</span>
1045
- <span class="cline-any cline-yes">1x</span>
1046
- <span class="cline-any cline-yes">2x</span>
1047
- <span class="cline-any cline-yes">2x</span>
1048
- <span class="cline-any cline-yes">2x</span>
1049
- <span class="cline-any cline-yes">2x</span>
1050
- <span class="cline-any cline-yes">2x</span>
1051
- <span class="cline-any cline-yes">2x</span>
1052
- <span class="cline-any cline-yes">2x</span>
1053
- <span class="cline-any cline-yes">2x</span>
1054
- <span class="cline-any cline-yes">2x</span>
1055
- <span class="cline-any cline-yes">2x</span>
1056
- <span class="cline-any cline-yes">2x</span>
1057
- <span class="cline-any cline-yes">2x</span>
1058
- <span class="cline-any cline-yes">2x</span>
1059
- <span class="cline-any cline-yes">2x</span>
1060
- <span class="cline-any cline-yes">2x</span>
1061
- <span class="cline-any cline-yes">2x</span>
1062
- <span class="cline-any cline-yes">2x</span>
1063
- <span class="cline-any cline-yes">2x</span>
1064
- <span class="cline-any cline-yes">2x</span>
1065
- <span class="cline-any cline-yes">2x</span>
1066
- <span class="cline-any cline-yes">2x</span>
1067
- <span class="cline-any cline-yes">2x</span>
1068
- <span class="cline-any cline-yes">2x</span>
1069
- <span class="cline-any cline-yes">2x</span>
1070
- <span class="cline-any cline-yes">2x</span>
1071
- <span class="cline-any cline-yes">2x</span>
1072
- <span class="cline-any cline-yes">2x</span>
1073
- <span class="cline-any cline-yes">2x</span>
1074
- <span class="cline-any cline-yes">2x</span>
1075
- <span class="cline-any cline-yes">2x</span>
1076
- <span class="cline-any cline-yes">2x</span>
1077
- <span class="cline-any cline-yes">2x</span>
1078
- <span class="cline-any cline-yes">2x</span>
1079
- <span class="cline-any cline-yes">2x</span>
1080
- <span class="cline-any cline-yes">2x</span>
1081
- <span class="cline-any cline-yes">2x</span>
1082
- <span class="cline-any cline-yes">2x</span>
1083
- <span class="cline-any cline-yes">2x</span>
1084
- <span class="cline-any cline-yes">2x</span>
928
+ <a name='L863'></a><a href='#L863'>863</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
1085
929
  <span class="cline-any cline-no">&nbsp;</span>
1086
930
  <span class="cline-any cline-no">&nbsp;</span>
1087
- <span class="cline-any cline-yes">2x</span>
1088
- <span class="cline-any cline-yes">2x</span>
1089
- <span class="cline-any cline-yes">2x</span>
1090
- <span class="cline-any cline-yes">2x</span>
1091
931
  <span class="cline-any cline-no">&nbsp;</span>
1092
932
  <span class="cline-any cline-no">&nbsp;</span>
1093
933
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1113,30 +953,6 @@
1113
953
  <span class="cline-any cline-no">&nbsp;</span>
1114
954
  <span class="cline-any cline-no">&nbsp;</span>
1115
955
  <span class="cline-any cline-no">&nbsp;</span>
1116
- <span class="cline-any cline-yes">2x</span>
1117
- <span class="cline-any cline-yes">2x</span>
1118
- <span class="cline-any cline-yes">2x</span>
1119
- <span class="cline-any cline-yes">2x</span>
1120
- <span class="cline-any cline-yes">2x</span>
1121
- <span class="cline-any cline-yes">2x</span>
1122
- <span class="cline-any cline-yes">2x</span>
1123
- <span class="cline-any cline-yes">2x</span>
1124
- <span class="cline-any cline-yes">2x</span>
1125
- <span class="cline-any cline-yes">2x</span>
1126
- <span class="cline-any cline-yes">2x</span>
1127
- <span class="cline-any cline-yes">2x</span>
1128
- <span class="cline-any cline-yes">2x</span>
1129
- <span class="cline-any cline-yes">2x</span>
1130
- <span class="cline-any cline-yes">2x</span>
1131
- <span class="cline-any cline-yes">2x</span>
1132
- <span class="cline-any cline-yes">2x</span>
1133
- <span class="cline-any cline-yes">2x</span>
1134
- <span class="cline-any cline-yes">2x</span>
1135
- <span class="cline-any cline-yes">2x</span>
1136
- <span class="cline-any cline-yes">2x</span>
1137
- <span class="cline-any cline-yes">2x</span>
1138
- <span class="cline-any cline-yes">2x</span>
1139
- <span class="cline-any cline-yes">2x</span>
1140
956
  <span class="cline-any cline-no">&nbsp;</span>
1141
957
  <span class="cline-any cline-no">&nbsp;</span>
1142
958
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1289,33 +1105,8 @@
1289
1105
  <span class="cline-any cline-no">&nbsp;</span>
1290
1106
  <span class="cline-any cline-no">&nbsp;</span>
1291
1107
  <span class="cline-any cline-no">&nbsp;</span>
1292
- <span class="cline-any cline-yes">2x</span>
1293
- <span class="cline-any cline-yes">2x</span>
1294
- <span class="cline-any cline-yes">2x</span>
1295
- <span class="cline-any cline-yes">2x</span>
1296
- <span class="cline-any cline-yes">2x</span>
1297
- <span class="cline-any cline-yes">2x</span>
1298
- <span class="cline-any cline-yes">2x</span>
1299
- <span class="cline-any cline-yes">2x</span>
1300
- <span class="cline-any cline-yes">2x</span>
1301
- <span class="cline-any cline-yes">2x</span>
1302
- <span class="cline-any cline-yes">2x</span>
1303
1108
  <span class="cline-any cline-no">&nbsp;</span>
1304
1109
  <span class="cline-any cline-no">&nbsp;</span>
1305
- <span class="cline-any cline-yes">2x</span>
1306
- <span class="cline-any cline-yes">2x</span>
1307
- <span class="cline-any cline-yes">2x</span>
1308
- <span class="cline-any cline-yes">2x</span>
1309
- <span class="cline-any cline-yes">2x</span>
1310
- <span class="cline-any cline-yes">2x</span>
1311
- <span class="cline-any cline-yes">2x</span>
1312
- <span class="cline-any cline-yes">2x</span>
1313
- <span class="cline-any cline-yes">2x</span>
1314
- <span class="cline-any cline-yes">2x</span>
1315
- <span class="cline-any cline-yes">2x</span>
1316
- <span class="cline-any cline-yes">2x</span>
1317
- <span class="cline-any cline-yes">2x</span>
1318
- <span class="cline-any cline-yes">2x</span>
1319
1110
  <span class="cline-any cline-no">&nbsp;</span>
1320
1111
  <span class="cline-any cline-no">&nbsp;</span>
1321
1112
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1335,22 +1126,6 @@
1335
1126
  <span class="cline-any cline-no">&nbsp;</span>
1336
1127
  <span class="cline-any cline-no">&nbsp;</span>
1337
1128
  <span class="cline-any cline-no">&nbsp;</span>
1338
- <span class="cline-any cline-yes">2x</span>
1339
- <span class="cline-any cline-yes">2x</span>
1340
- <span class="cline-any cline-yes">2x</span>
1341
- <span class="cline-any cline-yes">2x</span>
1342
- <span class="cline-any cline-yes">2x</span>
1343
- <span class="cline-any cline-yes">2x</span>
1344
- <span class="cline-any cline-yes">2x</span>
1345
- <span class="cline-any cline-yes">2x</span>
1346
- <span class="cline-any cline-yes">2x</span>
1347
- <span class="cline-any cline-yes">2x</span>
1348
- <span class="cline-any cline-yes">2x</span>
1349
- <span class="cline-any cline-yes">2x</span>
1350
- <span class="cline-any cline-yes">2x</span>
1351
- <span class="cline-any cline-yes">2x</span>
1352
- <span class="cline-any cline-yes">2x</span>
1353
- <span class="cline-any cline-yes">2x</span>
1354
1129
  <span class="cline-any cline-no">&nbsp;</span>
1355
1130
  <span class="cline-any cline-no">&nbsp;</span>
1356
1131
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1374,25 +1149,6 @@
1374
1149
  <span class="cline-any cline-no">&nbsp;</span>
1375
1150
  <span class="cline-any cline-no">&nbsp;</span>
1376
1151
  <span class="cline-any cline-no">&nbsp;</span>
1377
- <span class="cline-any cline-yes">2x</span>
1378
- <span class="cline-any cline-yes">2x</span>
1379
- <span class="cline-any cline-yes">2x</span>
1380
- <span class="cline-any cline-yes">2x</span>
1381
- <span class="cline-any cline-yes">2x</span>
1382
- <span class="cline-any cline-yes">2x</span>
1383
- <span class="cline-any cline-yes">2x</span>
1384
- <span class="cline-any cline-yes">2x</span>
1385
- <span class="cline-any cline-yes">2x</span>
1386
- <span class="cline-any cline-yes">2x</span>
1387
- <span class="cline-any cline-yes">2x</span>
1388
- <span class="cline-any cline-yes">2x</span>
1389
- <span class="cline-any cline-yes">2x</span>
1390
- <span class="cline-any cline-yes">2x</span>
1391
- <span class="cline-any cline-yes">2x</span>
1392
- <span class="cline-any cline-yes">2x</span>
1393
- <span class="cline-any cline-yes">2x</span>
1394
- <span class="cline-any cline-yes">2x</span>
1395
- <span class="cline-any cline-yes">2x</span>
1396
1152
  <span class="cline-any cline-no">&nbsp;</span>
1397
1153
  <span class="cline-any cline-no">&nbsp;</span>
1398
1154
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1429,11 +1185,6 @@
1429
1185
  <span class="cline-any cline-no">&nbsp;</span>
1430
1186
  <span class="cline-any cline-no">&nbsp;</span>
1431
1187
  <span class="cline-any cline-no">&nbsp;</span>
1432
- <span class="cline-any cline-yes">2x</span>
1433
- <span class="cline-any cline-yes">2x</span>
1434
- <span class="cline-any cline-yes">2x</span>
1435
- <span class="cline-any cline-yes">2x</span>
1436
- <span class="cline-any cline-yes">2x</span>
1437
1188
  <span class="cline-any cline-no">&nbsp;</span>
1438
1189
  <span class="cline-any cline-no">&nbsp;</span>
1439
1190
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1458,16 +1209,6 @@
1458
1209
  <span class="cline-any cline-no">&nbsp;</span>
1459
1210
  <span class="cline-any cline-no">&nbsp;</span>
1460
1211
  <span class="cline-any cline-no">&nbsp;</span>
1461
- <span class="cline-any cline-yes">2x</span>
1462
- <span class="cline-any cline-yes">2x</span>
1463
- <span class="cline-any cline-yes">2x</span>
1464
- <span class="cline-any cline-yes">2x</span>
1465
- <span class="cline-any cline-yes">2x</span>
1466
- <span class="cline-any cline-yes">2x</span>
1467
- <span class="cline-any cline-yes">2x</span>
1468
- <span class="cline-any cline-yes">2x</span>
1469
- <span class="cline-any cline-yes">2x</span>
1470
- <span class="cline-any cline-yes">2x</span>
1471
1212
  <span class="cline-any cline-no">&nbsp;</span>
1472
1213
  <span class="cline-any cline-no">&nbsp;</span>
1473
1214
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1589,32 +1330,12 @@
1589
1330
  <span class="cline-any cline-no">&nbsp;</span>
1590
1331
  <span class="cline-any cline-no">&nbsp;</span>
1591
1332
  <span class="cline-any cline-no">&nbsp;</span>
1592
- <span class="cline-any cline-yes">2x</span>
1593
- <span class="cline-any cline-yes">2x</span>
1594
- <span class="cline-any cline-yes">2x</span>
1595
- <span class="cline-any cline-yes">2x</span>
1596
- <span class="cline-any cline-yes">2x</span>
1597
- <span class="cline-any cline-yes">2x</span>
1598
- <span class="cline-any cline-yes">2x</span>
1599
- <span class="cline-any cline-yes">2x</span>
1600
- <span class="cline-any cline-yes">2x</span>
1601
- <span class="cline-any cline-yes">2x</span>
1602
1333
  <span class="cline-any cline-no">&nbsp;</span>
1603
1334
  <span class="cline-any cline-no">&nbsp;</span>
1604
1335
  <span class="cline-any cline-no">&nbsp;</span>
1605
1336
  <span class="cline-any cline-no">&nbsp;</span>
1606
1337
  <span class="cline-any cline-no">&nbsp;</span>
1607
1338
  <span class="cline-any cline-no">&nbsp;</span>
1608
- <span class="cline-any cline-yes">2x</span>
1609
- <span class="cline-any cline-yes">2x</span>
1610
- <span class="cline-any cline-yes">2x</span>
1611
- <span class="cline-any cline-yes">2x</span>
1612
- <span class="cline-any cline-yes">2x</span>
1613
- <span class="cline-any cline-yes">2x</span>
1614
- <span class="cline-any cline-yes">2x</span>
1615
- <span class="cline-any cline-yes">2x</span>
1616
- <span class="cline-any cline-yes">2x</span>
1617
- <span class="cline-any cline-yes">2x</span>
1618
1339
  <span class="cline-any cline-no">&nbsp;</span>
1619
1340
  <span class="cline-any cline-no">&nbsp;</span>
1620
1341
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1685,27 +1406,11 @@
1685
1406
  <span class="cline-any cline-no">&nbsp;</span>
1686
1407
  <span class="cline-any cline-no">&nbsp;</span>
1687
1408
  <span class="cline-any cline-no">&nbsp;</span>
1688
- <span class="cline-any cline-yes">2x</span>
1689
- <span class="cline-any cline-yes">2x</span>
1690
- <span class="cline-any cline-yes">2x</span>
1691
- <span class="cline-any cline-yes">2x</span>
1692
- <span class="cline-any cline-yes">2x</span>
1693
1409
  <span class="cline-any cline-no">&nbsp;</span>
1694
1410
  <span class="cline-any cline-no">&nbsp;</span>
1695
1411
  <span class="cline-any cline-no">&nbsp;</span>
1696
1412
  <span class="cline-any cline-no">&nbsp;</span>
1697
1413
  <span class="cline-any cline-no">&nbsp;</span>
1698
- <span class="cline-any cline-yes">2x</span>
1699
- <span class="cline-any cline-yes">2x</span>
1700
- <span class="cline-any cline-yes">2x</span>
1701
- <span class="cline-any cline-yes">2x</span>
1702
- <span class="cline-any cline-yes">2x</span>
1703
- <span class="cline-any cline-yes">2x</span>
1704
- <span class="cline-any cline-yes">2x</span>
1705
- <span class="cline-any cline-yes">2x</span>
1706
- <span class="cline-any cline-yes">2x</span>
1707
- <span class="cline-any cline-yes">2x</span>
1708
- <span class="cline-any cline-yes">2x</span>
1709
1414
  <span class="cline-any cline-no">&nbsp;</span>
1710
1415
  <span class="cline-any cline-no">&nbsp;</span>
1711
1416
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1720,13 +1425,6 @@
1720
1425
  <span class="cline-any cline-no">&nbsp;</span>
1721
1426
  <span class="cline-any cline-no">&nbsp;</span>
1722
1427
  <span class="cline-any cline-no">&nbsp;</span>
1723
- <span class="cline-any cline-yes">2x</span>
1724
- <span class="cline-any cline-yes">2x</span>
1725
- <span class="cline-any cline-yes">2x</span>
1726
- <span class="cline-any cline-yes">2x</span>
1727
- <span class="cline-any cline-yes">2x</span>
1728
- <span class="cline-any cline-yes">2x</span>
1729
- <span class="cline-any cline-yes">2x</span>
1730
1428
  <span class="cline-any cline-no">&nbsp;</span>
1731
1429
  <span class="cline-any cline-no">&nbsp;</span>
1732
1430
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1760,11 +1458,6 @@
1760
1458
  <span class="cline-any cline-no">&nbsp;</span>
1761
1459
  <span class="cline-any cline-no">&nbsp;</span>
1762
1460
  <span class="cline-any cline-no">&nbsp;</span>
1763
- <span class="cline-any cline-yes">2x</span>
1764
- <span class="cline-any cline-yes">2x</span>
1765
- <span class="cline-any cline-yes">2x</span>
1766
- <span class="cline-any cline-yes">2x</span>
1767
- <span class="cline-any cline-yes">2x</span>
1768
1461
  <span class="cline-any cline-no">&nbsp;</span>
1769
1462
  <span class="cline-any cline-no">&nbsp;</span>
1770
1463
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1775,181 +1468,488 @@
1775
1468
  <span class="cline-any cline-no">&nbsp;</span>
1776
1469
  <span class="cline-any cline-no">&nbsp;</span>
1777
1470
  <span class="cline-any cline-no">&nbsp;</span>
1778
- <span class="cline-any cline-yes">2x</span>
1779
- <span class="cline-any cline-yes">2x</span>
1780
- <span class="cline-any cline-yes">2x</span>
1781
- <span class="cline-any cline-yes">2x</span>
1782
- <span class="cline-any cline-yes">2x</span>
1783
1471
  <span class="cline-any cline-no">&nbsp;</span>
1784
1472
  <span class="cline-any cline-no">&nbsp;</span>
1785
1473
  <span class="cline-any cline-no">&nbsp;</span>
1786
1474
  <span class="cline-any cline-no">&nbsp;</span>
1787
1475
  <span class="cline-any cline-no">&nbsp;</span>
1788
1476
  <span class="cline-any cline-no">&nbsp;</span>
1789
- <span class="cline-any cline-yes">2x</span>
1790
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
1791
- * HSuite Native Connect
1792
- * Copyright 2024-2025 HSuite (https://hsuite.finance)
1793
- *
1794
- * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
1795
- *
1796
- * This file is part of HSuite Native Connect. For commercial licensing,
1797
- * visit https://hsuite.finance/licensing
1798
- */
1799
- &nbsp;
1800
- /**
1801
- * @file channel-client.service.ts
1802
- * @description Angular wrapper for the unified ChannelClient.
1803
- *
1804
- * ChannelClientService
1805
- *
1806
- * Angular service that wraps the ChannelClient from native-wallet-sdk,
1807
- * providing reactive signals and Angular-friendly APIs for dApp-wallet
1808
- * communication using the new unified channel protocol.
1809
- *
1810
- * Key features:
1811
- * - Reactive state via Angular signals
1812
- * - NgZone integration for proper change detection
1813
- * - Automatic session persistence
1814
- * - Support for both session (1:1) and party (N:N) channels
1815
- *
1816
- * This service is designed to replace the existing NostrSessionClient
1817
- * as part of the protocol simplification effort. It can coexist with
1818
- * the legacy implementation during migration.
1819
- *
1820
- * @Component({ ... })
1821
- * export class AppComponent {
1822
- * private channelService = inject(ChannelClientService);
1823
- *
1824
- * readonly state = this.channelService.state;
1825
- * readonly accounts = this.channelService.accounts;
1826
- *
1827
- * async connect() {
1828
- * const invite = await this.channelService.connect({
1829
- * type: 'session',
1830
- * appId: 'my-dapp',
1831
- * appName: 'My dApp',
1832
- * ledgerId: 'hedera',
1833
- * networkId: 'mainnet',
1834
- * });
1835
- * // Open wallet with invite URL
1836
- * window.open(this.channelService.getWalletInviteUrl(invite, walletUrl));
1837
- * }
1838
- * }
1839
- * ```
1840
- */
1841
- &nbsp;
1842
- import {
1843
- Injectable,
1844
- inject,
1845
- signal,
1846
- computed,
1847
- NgZone,
1848
- type Signal,
1849
- type WritableSignal,
1850
- } from '@angular/core';
1851
- import {
1852
- ChannelClient,
1853
- type ChannelInvite,
1854
- type ChannelState,
1855
- type ChannelType,
1856
- type ChannelAccount,
1857
- type TransportState,
1858
- type PersistedChannel,
1859
- encodeChannelInvite,
1860
- getLogger,
1861
- } from '@hsuite/native-connect-sdk';
1862
- &nbsp;
1863
- import { DEFAULT_WALLET_URL } from '../../models/provider-types';
1864
- import type { UnifiedAccount } from '../../models/unified-account.model';
1865
- &nbsp;
1866
- const logger = getLogger().scoped?.('ChannelClientService'<span class="branch-0 cbranch-no" title="branch not covered" >) ?? getLogger();</span>
1867
- &nbsp;
1868
- /**
1869
- * ChannelConnectConfig
1870
- *
1871
- * Configuration for establishing a new channel.
1872
- */
1873
- export interface ChannelConnectConfig {
1874
- /** Channel type: 'session' for 1:1, 'party' for multisig */
1875
- type: ChannelType;
1876
- /** dApp identifier */
1877
- appId: string;
1878
- /** dApp display name */
1879
- appName: string;
1880
- /** dApp icon URL (optional) */
1881
- appIcon?: string;
1882
- /**
1883
- * dApp origin URL (optional). When omitted, the SDK falls back to
1884
- * `window.location.origin` so the wallet can always show the user where the
1885
- * connection request is coming from. Override this only if your dApp serves
1886
- * the wallet integration from a different origin than the page hosting it.
1887
- */
1888
- appOrigin?: string;
1889
- /** Target ledger (e.g., 'hedera', 'xrpl') */
1890
- ledgerId: string;
1891
- /** Target network (e.g., 'mainnet', 'testnet') */
1892
- networkId: string;
1893
- /** Requested permissions */
1894
- permissions?: string[];
1895
- /** Nostr relay URLs (optional, uses defaults) */
1896
- relays?: string[];
1897
- /** Wallet URL for generating invite links */
1898
- walletUrl?: string;
1899
- }
1900
- &nbsp;
1901
- /**
1902
- * ChannelClientService
1903
- *
1904
- * Angular service for unified channel-based dApp-wallet communication.
1905
- */
1906
- @Injectable({ providedIn: 'root' })
1907
- export class ChannelClientService {
1908
- private readonly zone = inject(NgZone);
1909
- private client: ChannelClient | null = null;
1910
- &nbsp;
1911
- // ============================================================================
1912
- // Reactive State
1913
- // ============================================================================
1914
- &nbsp;
1915
- /** Current channel state */
1916
- private readonly _state: WritableSignal&lt;ChannelState&gt; = signal('idle');
1917
- readonly state: Signal&lt;ChannelState&gt; = this._state.asReadonly();
1918
- &nbsp;
1919
- /** Current transport state (nostr-only, p2p-connected, etc.) */
1920
- private readonly _transportState: WritableSignal&lt;TransportState&gt; = signal('nostr-only');
1921
- readonly transportState: Signal&lt;TransportState&gt; = this._transportState.asReadonly();
1922
- &nbsp;
1923
- /** Approved accounts from the wallet */
1924
- private readonly _accounts: WritableSignal&lt;ChannelAccount[]&gt; = signal([]);
1925
- readonly accounts: Signal&lt;ChannelAccount[]&gt; = this._accounts.asReadonly();
1926
- &nbsp;
1927
- /** Current channel invite (if connected) */
1928
- private readonly _currentInvite: WritableSignal&lt;ChannelInvite | null&gt; = signal(null);
1929
- readonly currentInvite: Signal&lt;ChannelInvite | null&gt; = this._currentInvite.asReadonly();
1930
- &nbsp;
1931
- /** Error message (if any) */
1932
- private readonly _error: WritableSignal&lt;string | null&gt; = signal(null);
1933
- readonly error: Signal&lt;string | null&gt; = this._error.asReadonly();
1934
- &nbsp;
1935
- /** Flag to prevent auto-restore from interfering with new connections */
1936
- private connectingNewSession = false;
1937
- &nbsp;
1938
- // ============================================================================
1939
- // Computed State
1940
- // ============================================================================
1941
- &nbsp;
1942
- /** Whether the channel is currently connected and active */
1943
- readonly isConnected = computed(() =&gt; this._state() === 'active');
1944
- &nbsp;
1945
- /** Whether we're currently connecting */
1946
- readonly isConnecting = computed(() =&gt; {
1477
+ <span class="cline-any cline-no">&nbsp;</span>
1478
+ <span class="cline-any cline-no">&nbsp;</span>
1479
+ <span class="cline-any cline-no">&nbsp;</span>
1480
+ <span class="cline-any cline-no">&nbsp;</span>
1481
+ <span class="cline-any cline-no">&nbsp;</span>
1482
+ <span class="cline-any cline-no">&nbsp;</span>
1483
+ <span class="cline-any cline-no">&nbsp;</span>
1484
+ <span class="cline-any cline-no">&nbsp;</span>
1485
+ <span class="cline-any cline-no">&nbsp;</span>
1486
+ <span class="cline-any cline-no">&nbsp;</span>
1487
+ <span class="cline-any cline-no">&nbsp;</span>
1488
+ <span class="cline-any cline-no">&nbsp;</span>
1489
+ <span class="cline-any cline-no">&nbsp;</span>
1490
+ <span class="cline-any cline-no">&nbsp;</span>
1491
+ <span class="cline-any cline-no">&nbsp;</span>
1492
+ <span class="cline-any cline-no">&nbsp;</span>
1493
+ <span class="cline-any cline-no">&nbsp;</span>
1494
+ <span class="cline-any cline-no">&nbsp;</span>
1495
+ <span class="cline-any cline-no">&nbsp;</span>
1496
+ <span class="cline-any cline-no">&nbsp;</span>
1497
+ <span class="cline-any cline-no">&nbsp;</span>
1498
+ <span class="cline-any cline-no">&nbsp;</span>
1499
+ <span class="cline-any cline-no">&nbsp;</span>
1500
+ <span class="cline-any cline-no">&nbsp;</span>
1501
+ <span class="cline-any cline-no">&nbsp;</span>
1502
+ <span class="cline-any cline-no">&nbsp;</span>
1503
+ <span class="cline-any cline-no">&nbsp;</span>
1504
+ <span class="cline-any cline-no">&nbsp;</span>
1505
+ <span class="cline-any cline-no">&nbsp;</span>
1506
+ <span class="cline-any cline-no">&nbsp;</span>
1507
+ <span class="cline-any cline-no">&nbsp;</span>
1508
+ <span class="cline-any cline-no">&nbsp;</span>
1509
+ <span class="cline-any cline-no">&nbsp;</span>
1510
+ <span class="cline-any cline-no">&nbsp;</span>
1511
+ <span class="cline-any cline-no">&nbsp;</span>
1512
+ <span class="cline-any cline-no">&nbsp;</span>
1513
+ <span class="cline-any cline-no">&nbsp;</span>
1514
+ <span class="cline-any cline-no">&nbsp;</span>
1515
+ <span class="cline-any cline-no">&nbsp;</span>
1516
+ <span class="cline-any cline-no">&nbsp;</span>
1517
+ <span class="cline-any cline-no">&nbsp;</span>
1518
+ <span class="cline-any cline-no">&nbsp;</span>
1519
+ <span class="cline-any cline-no">&nbsp;</span>
1520
+ <span class="cline-any cline-no">&nbsp;</span>
1521
+ <span class="cline-any cline-no">&nbsp;</span>
1522
+ <span class="cline-any cline-no">&nbsp;</span>
1523
+ <span class="cline-any cline-no">&nbsp;</span>
1524
+ <span class="cline-any cline-no">&nbsp;</span>
1525
+ <span class="cline-any cline-no">&nbsp;</span>
1526
+ <span class="cline-any cline-no">&nbsp;</span>
1527
+ <span class="cline-any cline-no">&nbsp;</span>
1528
+ <span class="cline-any cline-no">&nbsp;</span>
1529
+ <span class="cline-any cline-no">&nbsp;</span>
1530
+ <span class="cline-any cline-no">&nbsp;</span>
1531
+ <span class="cline-any cline-no">&nbsp;</span>
1532
+ <span class="cline-any cline-no">&nbsp;</span>
1533
+ <span class="cline-any cline-no">&nbsp;</span>
1534
+ <span class="cline-any cline-no">&nbsp;</span>
1535
+ <span class="cline-any cline-no">&nbsp;</span>
1536
+ <span class="cline-any cline-no">&nbsp;</span>
1537
+ <span class="cline-any cline-no">&nbsp;</span>
1538
+ <span class="cline-any cline-no">&nbsp;</span>
1539
+ <span class="cline-any cline-no">&nbsp;</span>
1540
+ <span class="cline-any cline-no">&nbsp;</span>
1541
+ <span class="cline-any cline-no">&nbsp;</span>
1542
+ <span class="cline-any cline-no">&nbsp;</span>
1543
+ <span class="cline-any cline-no">&nbsp;</span>
1544
+ <span class="cline-any cline-no">&nbsp;</span>
1545
+ <span class="cline-any cline-no">&nbsp;</span>
1546
+ <span class="cline-any cline-no">&nbsp;</span>
1547
+ <span class="cline-any cline-no">&nbsp;</span>
1548
+ <span class="cline-any cline-no">&nbsp;</span>
1549
+ <span class="cline-any cline-no">&nbsp;</span>
1550
+ <span class="cline-any cline-no">&nbsp;</span>
1551
+ <span class="cline-any cline-no">&nbsp;</span>
1552
+ <span class="cline-any cline-no">&nbsp;</span>
1553
+ <span class="cline-any cline-no">&nbsp;</span>
1554
+ <span class="cline-any cline-no">&nbsp;</span>
1555
+ <span class="cline-any cline-no">&nbsp;</span>
1556
+ <span class="cline-any cline-no">&nbsp;</span>
1557
+ <span class="cline-any cline-no">&nbsp;</span>
1558
+ <span class="cline-any cline-no">&nbsp;</span>
1559
+ <span class="cline-any cline-no">&nbsp;</span>
1560
+ <span class="cline-any cline-no">&nbsp;</span>
1561
+ <span class="cline-any cline-no">&nbsp;</span>
1562
+ <span class="cline-any cline-no">&nbsp;</span>
1563
+ <span class="cline-any cline-no">&nbsp;</span>
1564
+ <span class="cline-any cline-no">&nbsp;</span>
1565
+ <span class="cline-any cline-no">&nbsp;</span>
1566
+ <span class="cline-any cline-no">&nbsp;</span>
1567
+ <span class="cline-any cline-no">&nbsp;</span>
1568
+ <span class="cline-any cline-no">&nbsp;</span>
1569
+ <span class="cline-any cline-no">&nbsp;</span>
1570
+ <span class="cline-any cline-no">&nbsp;</span>
1571
+ <span class="cline-any cline-no">&nbsp;</span>
1572
+ <span class="cline-any cline-no">&nbsp;</span>
1573
+ <span class="cline-any cline-no">&nbsp;</span>
1574
+ <span class="cline-any cline-no">&nbsp;</span>
1575
+ <span class="cline-any cline-no">&nbsp;</span>
1576
+ <span class="cline-any cline-no">&nbsp;</span>
1577
+ <span class="cline-any cline-no">&nbsp;</span>
1578
+ <span class="cline-any cline-no">&nbsp;</span>
1579
+ <span class="cline-any cline-no">&nbsp;</span>
1580
+ <span class="cline-any cline-no">&nbsp;</span>
1581
+ <span class="cline-any cline-no">&nbsp;</span>
1582
+ <span class="cline-any cline-no">&nbsp;</span>
1583
+ <span class="cline-any cline-no">&nbsp;</span>
1584
+ <span class="cline-any cline-no">&nbsp;</span>
1585
+ <span class="cline-any cline-no">&nbsp;</span>
1586
+ <span class="cline-any cline-no">&nbsp;</span>
1587
+ <span class="cline-any cline-no">&nbsp;</span>
1588
+ <span class="cline-any cline-no">&nbsp;</span>
1589
+ <span class="cline-any cline-no">&nbsp;</span>
1590
+ <span class="cline-any cline-no">&nbsp;</span>
1591
+ <span class="cline-any cline-no">&nbsp;</span>
1592
+ <span class="cline-any cline-no">&nbsp;</span>
1593
+ <span class="cline-any cline-no">&nbsp;</span>
1594
+ <span class="cline-any cline-no">&nbsp;</span>
1595
+ <span class="cline-any cline-no">&nbsp;</span>
1596
+ <span class="cline-any cline-no">&nbsp;</span>
1597
+ <span class="cline-any cline-no">&nbsp;</span>
1598
+ <span class="cline-any cline-no">&nbsp;</span>
1599
+ <span class="cline-any cline-no">&nbsp;</span>
1600
+ <span class="cline-any cline-no">&nbsp;</span>
1601
+ <span class="cline-any cline-no">&nbsp;</span>
1602
+ <span class="cline-any cline-no">&nbsp;</span>
1603
+ <span class="cline-any cline-no">&nbsp;</span>
1604
+ <span class="cline-any cline-no">&nbsp;</span>
1605
+ <span class="cline-any cline-no">&nbsp;</span>
1606
+ <span class="cline-any cline-no">&nbsp;</span>
1607
+ <span class="cline-any cline-no">&nbsp;</span>
1608
+ <span class="cline-any cline-no">&nbsp;</span>
1609
+ <span class="cline-any cline-no">&nbsp;</span>
1610
+ <span class="cline-any cline-no">&nbsp;</span>
1611
+ <span class="cline-any cline-no">&nbsp;</span>
1612
+ <span class="cline-any cline-no">&nbsp;</span>
1613
+ <span class="cline-any cline-no">&nbsp;</span>
1614
+ <span class="cline-any cline-no">&nbsp;</span>
1615
+ <span class="cline-any cline-no">&nbsp;</span>
1616
+ <span class="cline-any cline-no">&nbsp;</span>
1617
+ <span class="cline-any cline-no">&nbsp;</span>
1618
+ <span class="cline-any cline-no">&nbsp;</span>
1619
+ <span class="cline-any cline-no">&nbsp;</span>
1620
+ <span class="cline-any cline-no">&nbsp;</span>
1621
+ <span class="cline-any cline-no">&nbsp;</span>
1622
+ <span class="cline-any cline-no">&nbsp;</span>
1623
+ <span class="cline-any cline-no">&nbsp;</span>
1624
+ <span class="cline-any cline-no">&nbsp;</span>
1625
+ <span class="cline-any cline-no">&nbsp;</span>
1626
+ <span class="cline-any cline-no">&nbsp;</span>
1627
+ <span class="cline-any cline-no">&nbsp;</span>
1628
+ <span class="cline-any cline-no">&nbsp;</span>
1629
+ <span class="cline-any cline-no">&nbsp;</span>
1630
+ <span class="cline-any cline-no">&nbsp;</span>
1631
+ <span class="cline-any cline-no">&nbsp;</span>
1632
+ <span class="cline-any cline-no">&nbsp;</span>
1633
+ <span class="cline-any cline-no">&nbsp;</span>
1634
+ <span class="cline-any cline-no">&nbsp;</span>
1635
+ <span class="cline-any cline-no">&nbsp;</span>
1636
+ <span class="cline-any cline-no">&nbsp;</span>
1637
+ <span class="cline-any cline-no">&nbsp;</span>
1638
+ <span class="cline-any cline-no">&nbsp;</span>
1639
+ <span class="cline-any cline-no">&nbsp;</span>
1640
+ <span class="cline-any cline-no">&nbsp;</span>
1641
+ <span class="cline-any cline-no">&nbsp;</span>
1642
+ <span class="cline-any cline-no">&nbsp;</span>
1643
+ <span class="cline-any cline-no">&nbsp;</span>
1644
+ <span class="cline-any cline-no">&nbsp;</span>
1645
+ <span class="cline-any cline-no">&nbsp;</span>
1646
+ <span class="cline-any cline-no">&nbsp;</span>
1647
+ <span class="cline-any cline-no">&nbsp;</span>
1648
+ <span class="cline-any cline-no">&nbsp;</span>
1649
+ <span class="cline-any cline-no">&nbsp;</span>
1650
+ <span class="cline-any cline-no">&nbsp;</span>
1651
+ <span class="cline-any cline-no">&nbsp;</span>
1652
+ <span class="cline-any cline-no">&nbsp;</span>
1653
+ <span class="cline-any cline-no">&nbsp;</span>
1654
+ <span class="cline-any cline-no">&nbsp;</span>
1655
+ <span class="cline-any cline-no">&nbsp;</span>
1656
+ <span class="cline-any cline-no">&nbsp;</span>
1657
+ <span class="cline-any cline-no">&nbsp;</span>
1658
+ <span class="cline-any cline-no">&nbsp;</span>
1659
+ <span class="cline-any cline-no">&nbsp;</span>
1660
+ <span class="cline-any cline-no">&nbsp;</span>
1661
+ <span class="cline-any cline-no">&nbsp;</span>
1662
+ <span class="cline-any cline-no">&nbsp;</span>
1663
+ <span class="cline-any cline-no">&nbsp;</span>
1664
+ <span class="cline-any cline-no">&nbsp;</span>
1665
+ <span class="cline-any cline-no">&nbsp;</span>
1666
+ <span class="cline-any cline-no">&nbsp;</span>
1667
+ <span class="cline-any cline-no">&nbsp;</span>
1668
+ <span class="cline-any cline-no">&nbsp;</span>
1669
+ <span class="cline-any cline-no">&nbsp;</span>
1670
+ <span class="cline-any cline-no">&nbsp;</span>
1671
+ <span class="cline-any cline-no">&nbsp;</span>
1672
+ <span class="cline-any cline-no">&nbsp;</span>
1673
+ <span class="cline-any cline-no">&nbsp;</span>
1674
+ <span class="cline-any cline-no">&nbsp;</span>
1675
+ <span class="cline-any cline-no">&nbsp;</span>
1676
+ <span class="cline-any cline-no">&nbsp;</span>
1677
+ <span class="cline-any cline-no">&nbsp;</span>
1678
+ <span class="cline-any cline-no">&nbsp;</span>
1679
+ <span class="cline-any cline-no">&nbsp;</span>
1680
+ <span class="cline-any cline-no">&nbsp;</span>
1681
+ <span class="cline-any cline-no">&nbsp;</span>
1682
+ <span class="cline-any cline-no">&nbsp;</span>
1683
+ <span class="cline-any cline-no">&nbsp;</span>
1684
+ <span class="cline-any cline-no">&nbsp;</span>
1685
+ <span class="cline-any cline-no">&nbsp;</span>
1686
+ <span class="cline-any cline-no">&nbsp;</span>
1687
+ <span class="cline-any cline-no">&nbsp;</span>
1688
+ <span class="cline-any cline-no">&nbsp;</span>
1689
+ <span class="cline-any cline-no">&nbsp;</span>
1690
+ <span class="cline-any cline-no">&nbsp;</span>
1691
+ <span class="cline-any cline-no">&nbsp;</span>
1692
+ <span class="cline-any cline-no">&nbsp;</span>
1693
+ <span class="cline-any cline-no">&nbsp;</span>
1694
+ <span class="cline-any cline-no">&nbsp;</span>
1695
+ <span class="cline-any cline-no">&nbsp;</span>
1696
+ <span class="cline-any cline-no">&nbsp;</span>
1697
+ <span class="cline-any cline-no">&nbsp;</span>
1698
+ <span class="cline-any cline-no">&nbsp;</span>
1699
+ <span class="cline-any cline-no">&nbsp;</span>
1700
+ <span class="cline-any cline-no">&nbsp;</span>
1701
+ <span class="cline-any cline-no">&nbsp;</span>
1702
+ <span class="cline-any cline-no">&nbsp;</span>
1703
+ <span class="cline-any cline-no">&nbsp;</span>
1704
+ <span class="cline-any cline-no">&nbsp;</span>
1705
+ <span class="cline-any cline-no">&nbsp;</span>
1706
+ <span class="cline-any cline-no">&nbsp;</span>
1707
+ <span class="cline-any cline-no">&nbsp;</span>
1708
+ <span class="cline-any cline-no">&nbsp;</span>
1709
+ <span class="cline-any cline-no">&nbsp;</span>
1710
+ <span class="cline-any cline-no">&nbsp;</span>
1711
+ <span class="cline-any cline-no">&nbsp;</span>
1712
+ <span class="cline-any cline-no">&nbsp;</span>
1713
+ <span class="cline-any cline-no">&nbsp;</span>
1714
+ <span class="cline-any cline-no">&nbsp;</span>
1715
+ <span class="cline-any cline-no">&nbsp;</span>
1716
+ <span class="cline-any cline-no">&nbsp;</span>
1717
+ <span class="cline-any cline-no">&nbsp;</span>
1718
+ <span class="cline-any cline-no">&nbsp;</span>
1719
+ <span class="cline-any cline-no">&nbsp;</span>
1720
+ <span class="cline-any cline-no">&nbsp;</span>
1721
+ <span class="cline-any cline-no">&nbsp;</span>
1722
+ <span class="cline-any cline-no">&nbsp;</span>
1723
+ <span class="cline-any cline-no">&nbsp;</span>
1724
+ <span class="cline-any cline-no">&nbsp;</span>
1725
+ <span class="cline-any cline-no">&nbsp;</span>
1726
+ <span class="cline-any cline-no">&nbsp;</span>
1727
+ <span class="cline-any cline-no">&nbsp;</span>
1728
+ <span class="cline-any cline-no">&nbsp;</span>
1729
+ <span class="cline-any cline-no">&nbsp;</span>
1730
+ <span class="cline-any cline-no">&nbsp;</span>
1731
+ <span class="cline-any cline-no">&nbsp;</span>
1732
+ <span class="cline-any cline-no">&nbsp;</span>
1733
+ <span class="cline-any cline-no">&nbsp;</span>
1734
+ <span class="cline-any cline-no">&nbsp;</span>
1735
+ <span class="cline-any cline-no">&nbsp;</span>
1736
+ <span class="cline-any cline-no">&nbsp;</span>
1737
+ <span class="cline-any cline-no">&nbsp;</span>
1738
+ <span class="cline-any cline-no">&nbsp;</span>
1739
+ <span class="cline-any cline-no">&nbsp;</span>
1740
+ <span class="cline-any cline-no">&nbsp;</span>
1741
+ <span class="cline-any cline-no">&nbsp;</span>
1742
+ <span class="cline-any cline-no">&nbsp;</span>
1743
+ <span class="cline-any cline-no">&nbsp;</span>
1744
+ <span class="cline-any cline-no">&nbsp;</span>
1745
+ <span class="cline-any cline-no">&nbsp;</span>
1746
+ <span class="cline-any cline-no">&nbsp;</span>
1747
+ <span class="cline-any cline-no">&nbsp;</span>
1748
+ <span class="cline-any cline-no">&nbsp;</span>
1749
+ <span class="cline-any cline-no">&nbsp;</span>
1750
+ <span class="cline-any cline-no">&nbsp;</span>
1751
+ <span class="cline-any cline-no">&nbsp;</span>
1752
+ <span class="cline-any cline-no">&nbsp;</span>
1753
+ <span class="cline-any cline-no">&nbsp;</span>
1754
+ <span class="cline-any cline-no">&nbsp;</span>
1755
+ <span class="cline-any cline-no">&nbsp;</span>
1756
+ <span class="cline-any cline-no">&nbsp;</span>
1757
+ <span class="cline-any cline-no">&nbsp;</span>
1758
+ <span class="cline-any cline-no">&nbsp;</span>
1759
+ <span class="cline-any cline-no">&nbsp;</span>
1760
+ <span class="cline-any cline-no">&nbsp;</span>
1761
+ <span class="cline-any cline-no">&nbsp;</span>
1762
+ <span class="cline-any cline-no">&nbsp;</span>
1763
+ <span class="cline-any cline-no">&nbsp;</span>
1764
+ <span class="cline-any cline-no">&nbsp;</span>
1765
+ <span class="cline-any cline-no">&nbsp;</span>
1766
+ <span class="cline-any cline-no">&nbsp;</span>
1767
+ <span class="cline-any cline-no">&nbsp;</span>
1768
+ <span class="cline-any cline-no">&nbsp;</span>
1769
+ <span class="cline-any cline-no">&nbsp;</span>
1770
+ <span class="cline-any cline-no">&nbsp;</span>
1771
+ <span class="cline-any cline-no">&nbsp;</span>
1772
+ <span class="cline-any cline-no">&nbsp;</span>
1773
+ <span class="cline-any cline-no">&nbsp;</span>
1774
+ <span class="cline-any cline-no">&nbsp;</span>
1775
+ <span class="cline-any cline-no">&nbsp;</span>
1776
+ <span class="cline-any cline-no">&nbsp;</span>
1777
+ <span class="cline-any cline-no">&nbsp;</span>
1778
+ <span class="cline-any cline-no">&nbsp;</span>
1779
+ <span class="cline-any cline-no">&nbsp;</span>
1780
+ <span class="cline-any cline-no">&nbsp;</span>
1781
+ <span class="cline-any cline-no">&nbsp;</span>
1782
+ <span class="cline-any cline-no">&nbsp;</span>
1783
+ <span class="cline-any cline-no">&nbsp;</span>
1784
+ <span class="cline-any cline-no">&nbsp;</span>
1785
+ <span class="cline-any cline-no">&nbsp;</span>
1786
+ <span class="cline-any cline-no">&nbsp;</span>
1787
+ <span class="cline-any cline-no">&nbsp;</span>
1788
+ <span class="cline-any cline-no">&nbsp;</span>
1789
+ <span class="cline-any cline-no">&nbsp;</span>
1790
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >/**<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
1791
+ <span class="cstat-no" title="statement not covered" > * HSuite Native Connect</span>
1792
+ <span class="cstat-no" title="statement not covered" > * Copyright 2024-2025 HSuite (https://hsuite.finance)</span>
1793
+ <span class="cstat-no" title="statement not covered" > *</span>
1794
+ <span class="cstat-no" title="statement not covered" > * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0</span>
1795
+ <span class="cstat-no" title="statement not covered" > *</span>
1796
+ <span class="cstat-no" title="statement not covered" > * This file is part of HSuite Native Connect. For commercial licensing,</span>
1797
+ <span class="cstat-no" title="statement not covered" > * visit https://hsuite.finance/licensing</span>
1798
+ <span class="cstat-no" title="statement not covered" > */</span>
1799
+ <span class="cstat-no" title="statement not covered" ></span>
1800
+ <span class="cstat-no" title="statement not covered" >/**</span>
1801
+ <span class="cstat-no" title="statement not covered" > * @file channel-client.service.ts</span>
1802
+ <span class="cstat-no" title="statement not covered" > * @description Angular wrapper for the unified ChannelClient.</span>
1803
+ <span class="cstat-no" title="statement not covered" > *</span>
1804
+ <span class="cstat-no" title="statement not covered" > * ChannelClientService</span>
1805
+ <span class="cstat-no" title="statement not covered" > *</span>
1806
+ <span class="cstat-no" title="statement not covered" > * Angular service that wraps the ChannelClient from native-wallet-sdk,</span>
1807
+ <span class="cstat-no" title="statement not covered" > * providing reactive signals and Angular-friendly APIs for dApp-wallet</span>
1808
+ <span class="cstat-no" title="statement not covered" > * communication using the new unified channel protocol.</span>
1809
+ <span class="cstat-no" title="statement not covered" > *</span>
1810
+ <span class="cstat-no" title="statement not covered" > * Key features:</span>
1811
+ <span class="cstat-no" title="statement not covered" > * - Reactive state via Angular signals</span>
1812
+ <span class="cstat-no" title="statement not covered" > * - NgZone integration for proper change detection</span>
1813
+ <span class="cstat-no" title="statement not covered" > * - Automatic session persistence</span>
1814
+ <span class="cstat-no" title="statement not covered" > * - Support for both session (1:1) and party (N:N) channels</span>
1815
+ <span class="cstat-no" title="statement not covered" > *</span>
1816
+ <span class="cstat-no" title="statement not covered" > * This service is designed to replace the existing NostrSessionClient</span>
1817
+ <span class="cstat-no" title="statement not covered" > * as part of the protocol simplification effort. It can coexist with</span>
1818
+ <span class="cstat-no" title="statement not covered" > * the legacy implementation during migration.</span>
1819
+ <span class="cstat-no" title="statement not covered" > *</span>
1820
+ <span class="cstat-no" title="statement not covered" > * @Component({ ... })</span>
1821
+ <span class="cstat-no" title="statement not covered" > * export class AppComponent {</span>
1822
+ <span class="cstat-no" title="statement not covered" > * private channelService = inject(ChannelClientService);</span>
1823
+ <span class="cstat-no" title="statement not covered" > *</span>
1824
+ <span class="cstat-no" title="statement not covered" > * readonly state = this.channelService.state;</span>
1825
+ <span class="cstat-no" title="statement not covered" > * readonly accounts = this.channelService.accounts;</span>
1826
+ <span class="cstat-no" title="statement not covered" > *</span>
1827
+ <span class="cstat-no" title="statement not covered" > * async connect() {</span>
1828
+ <span class="cstat-no" title="statement not covered" > * const invite = await this.channelService.connect({</span>
1829
+ <span class="cstat-no" title="statement not covered" > * type: 'session',</span>
1830
+ <span class="cstat-no" title="statement not covered" > * appId: 'my-dapp',</span>
1831
+ <span class="cstat-no" title="statement not covered" > * appName: 'My dApp',</span>
1832
+ <span class="cstat-no" title="statement not covered" > * ledgerId: 'hedera',</span>
1833
+ <span class="cstat-no" title="statement not covered" > * networkId: 'mainnet',</span>
1834
+ <span class="cstat-no" title="statement not covered" > * });</span>
1835
+ <span class="cstat-no" title="statement not covered" > * // Open wallet with invite URL</span>
1836
+ <span class="cstat-no" title="statement not covered" > * window.open(this.channelService.getWalletInviteUrl(invite, walletUrl));</span>
1837
+ <span class="cstat-no" title="statement not covered" > * }</span>
1838
+ <span class="cstat-no" title="statement not covered" > * }</span>
1839
+ <span class="cstat-no" title="statement not covered" > * ```</span>
1840
+ <span class="cstat-no" title="statement not covered" > */</span>
1841
+ <span class="cstat-no" title="statement not covered" ></span>
1842
+ <span class="cstat-no" title="statement not covered" >import {</span>
1843
+ <span class="cstat-no" title="statement not covered" > Injectable,</span>
1844
+ <span class="cstat-no" title="statement not covered" > inject,</span>
1845
+ <span class="cstat-no" title="statement not covered" > signal,</span>
1846
+ <span class="cstat-no" title="statement not covered" > computed,</span>
1847
+ <span class="cstat-no" title="statement not covered" > NgZone,</span>
1848
+ <span class="cstat-no" title="statement not covered" > type Signal,</span>
1849
+ <span class="cstat-no" title="statement not covered" > type WritableSignal,</span>
1850
+ <span class="cstat-no" title="statement not covered" >} from '@angular/core';</span>
1851
+ <span class="cstat-no" title="statement not covered" >import {</span>
1852
+ <span class="cstat-no" title="statement not covered" > ChannelClient,</span>
1853
+ <span class="cstat-no" title="statement not covered" > type ChannelInvite,</span>
1854
+ <span class="cstat-no" title="statement not covered" > type ChannelState,</span>
1855
+ <span class="cstat-no" title="statement not covered" > type ChannelType,</span>
1856
+ <span class="cstat-no" title="statement not covered" > type ChannelAccount,</span>
1857
+ <span class="cstat-no" title="statement not covered" > type TransportState,</span>
1858
+ <span class="cstat-no" title="statement not covered" > type PersistedChannel,</span>
1859
+ <span class="cstat-no" title="statement not covered" > encodeChannelInvite,</span>
1860
+ <span class="cstat-no" title="statement not covered" > getLogger,</span>
1861
+ <span class="cstat-no" title="statement not covered" >} from '@hsuite/native-connect-sdk';</span>
1862
+ <span class="cstat-no" title="statement not covered" ></span>
1863
+ <span class="cstat-no" title="statement not covered" >import { DEFAULT_WALLET_URL } from '../../models/provider-types';</span>
1864
+ <span class="cstat-no" title="statement not covered" >import type { UnifiedAccount } from '../../models/unified-account.model';</span>
1865
+ <span class="cstat-no" title="statement not covered" ></span>
1866
+ <span class="cstat-no" title="statement not covered" >const logger = getLogger().scoped?.('ChannelClientService') ?? getLogger();</span>
1867
+ <span class="cstat-no" title="statement not covered" ></span>
1868
+ <span class="cstat-no" title="statement not covered" >/**</span>
1869
+ <span class="cstat-no" title="statement not covered" > * ChannelConnectConfig</span>
1870
+ <span class="cstat-no" title="statement not covered" > *</span>
1871
+ <span class="cstat-no" title="statement not covered" > * Configuration for establishing a new channel.</span>
1872
+ <span class="cstat-no" title="statement not covered" > */</span>
1873
+ <span class="cstat-no" title="statement not covered" >export interface ChannelConnectConfig {</span>
1874
+ <span class="cstat-no" title="statement not covered" > /** Channel type: 'session' for 1:1, 'party' for multisig */</span>
1875
+ <span class="cstat-no" title="statement not covered" > type: ChannelType;</span>
1876
+ <span class="cstat-no" title="statement not covered" > /** dApp identifier */</span>
1877
+ <span class="cstat-no" title="statement not covered" > appId: string;</span>
1878
+ <span class="cstat-no" title="statement not covered" > /** dApp display name */</span>
1879
+ <span class="cstat-no" title="statement not covered" > appName: string;</span>
1880
+ <span class="cstat-no" title="statement not covered" > /** dApp icon URL (optional) */</span>
1881
+ <span class="cstat-no" title="statement not covered" > appIcon?: string;</span>
1882
+ <span class="cstat-no" title="statement not covered" > /**</span>
1883
+ <span class="cstat-no" title="statement not covered" > * dApp origin URL (optional). When omitted, the SDK falls back to</span>
1884
+ <span class="cstat-no" title="statement not covered" > * `window.location.origin` so the wallet can always show the user where the</span>
1885
+ <span class="cstat-no" title="statement not covered" > * connection request is coming from. Override this only if your dApp serves</span>
1886
+ <span class="cstat-no" title="statement not covered" > * the wallet integration from a different origin than the page hosting it.</span>
1887
+ <span class="cstat-no" title="statement not covered" > */</span>
1888
+ <span class="cstat-no" title="statement not covered" > appOrigin?: string;</span>
1889
+ <span class="cstat-no" title="statement not covered" > /** Target ledger (e.g., 'hedera', 'xrpl') */</span>
1890
+ <span class="cstat-no" title="statement not covered" > ledgerId: string;</span>
1891
+ <span class="cstat-no" title="statement not covered" > /** Target network (e.g., 'mainnet', 'testnet') */</span>
1892
+ <span class="cstat-no" title="statement not covered" > networkId: string;</span>
1893
+ <span class="cstat-no" title="statement not covered" > /** Requested permissions */</span>
1894
+ <span class="cstat-no" title="statement not covered" > permissions?: string[];</span>
1895
+ <span class="cstat-no" title="statement not covered" > /** Nostr relay URLs (optional, uses defaults) */</span>
1896
+ <span class="cstat-no" title="statement not covered" > relays?: string[];</span>
1897
+ <span class="cstat-no" title="statement not covered" > /** Wallet URL for generating invite links */</span>
1898
+ <span class="cstat-no" title="statement not covered" > walletUrl?: string;</span>
1899
+ <span class="cstat-no" title="statement not covered" >}</span>
1900
+ <span class="cstat-no" title="statement not covered" ></span>
1901
+ <span class="cstat-no" title="statement not covered" >/**</span>
1902
+ <span class="cstat-no" title="statement not covered" > * ChannelClientService</span>
1903
+ <span class="cstat-no" title="statement not covered" > *</span>
1904
+ <span class="cstat-no" title="statement not covered" > * Angular service for unified channel-based dApp-wallet communication.</span>
1905
+ <span class="cstat-no" title="statement not covered" > */</span>
1906
+ <span class="cstat-no" title="statement not covered" >@Injectable({ providedIn: 'root' })</span>
1907
+ <span class="cstat-no" title="statement not covered" >export class ChannelClientService {</span>
1908
+ <span class="cstat-no" title="statement not covered" > private readonly zone = inject(NgZone);</span>
1909
+ <span class="cstat-no" title="statement not covered" > private client: ChannelClient | null = null;</span>
1910
+ <span class="cstat-no" title="statement not covered" ></span>
1911
+ <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
1912
+ <span class="cstat-no" title="statement not covered" > // Reactive State</span>
1913
+ <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
1914
+ <span class="cstat-no" title="statement not covered" ></span>
1915
+ <span class="cstat-no" title="statement not covered" > /** Current channel state */</span>
1916
+ <span class="cstat-no" title="statement not covered" > private readonly _state: WritableSignal&lt;ChannelState&gt; = signal('idle');</span>
1917
+ <span class="cstat-no" title="statement not covered" > readonly state: Signal&lt;ChannelState&gt; = this._state.asReadonly();</span>
1918
+ <span class="cstat-no" title="statement not covered" ></span>
1919
+ <span class="cstat-no" title="statement not covered" > /** Current transport state (nostr-only, p2p-connected, etc.) */</span>
1920
+ <span class="cstat-no" title="statement not covered" > private readonly _transportState: WritableSignal&lt;TransportState&gt; = signal('nostr-only');</span>
1921
+ <span class="cstat-no" title="statement not covered" > readonly transportState: Signal&lt;TransportState&gt; = this._transportState.asReadonly();</span>
1922
+ <span class="cstat-no" title="statement not covered" ></span>
1923
+ <span class="cstat-no" title="statement not covered" > /** Approved accounts from the wallet */</span>
1924
+ <span class="cstat-no" title="statement not covered" > private readonly _accounts: WritableSignal&lt;ChannelAccount[]&gt; = signal([]);</span>
1925
+ <span class="cstat-no" title="statement not covered" > readonly accounts: Signal&lt;ChannelAccount[]&gt; = this._accounts.asReadonly();</span>
1926
+ <span class="cstat-no" title="statement not covered" ></span>
1927
+ <span class="cstat-no" title="statement not covered" > /** Current channel invite (if connected) */</span>
1928
+ <span class="cstat-no" title="statement not covered" > private readonly _currentInvite: WritableSignal&lt;ChannelInvite | null&gt; = signal(null);</span>
1929
+ <span class="cstat-no" title="statement not covered" > readonly currentInvite: Signal&lt;ChannelInvite | null&gt; = this._currentInvite.asReadonly();</span>
1930
+ <span class="cstat-no" title="statement not covered" ></span>
1931
+ <span class="cstat-no" title="statement not covered" > /** Error message (if any) */</span>
1932
+ <span class="cstat-no" title="statement not covered" > private readonly _error: WritableSignal&lt;string | null&gt; = signal(null);</span>
1933
+ <span class="cstat-no" title="statement not covered" > readonly error: Signal&lt;string | null&gt; = this._error.asReadonly();</span>
1934
+ <span class="cstat-no" title="statement not covered" ></span>
1935
+ <span class="cstat-no" title="statement not covered" > /** Flag to prevent auto-restore from interfering with new connections */</span>
1936
+ <span class="cstat-no" title="statement not covered" > private connectingNewSession = false;</span>
1937
+ <span class="cstat-no" title="statement not covered" ></span>
1938
+ <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
1939
+ <span class="cstat-no" title="statement not covered" > // Computed State</span>
1940
+ <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
1941
+ <span class="cstat-no" title="statement not covered" ></span>
1942
+ <span class="cstat-no" title="statement not covered" > /** Whether the channel is currently connected and active */</span>
1943
+ <span class="cstat-no" title="statement not covered" > readonly isConnected = computed(() =&gt; this._state() === 'active');</span>
1944
+ <span class="cstat-no" title="statement not covered" ></span>
1945
+ <span class="cstat-no" title="statement not covered" > /** Whether we're currently connecting */</span>
1946
+ <span class="cstat-no" title="statement not covered" > readonly isConnecting = computed(() =&gt; {</span>
1947
1947
  <span class="cstat-no" title="statement not covered" > const s = this._state();</span>
1948
1948
  <span class="cstat-no" title="statement not covered" > return s === 'connecting' || s === 'pending';</span>
1949
- });
1950
- &nbsp;
1951
- /** Accounts formatted as UnifiedAccount for compatibility */
1952
- readonly unifiedAccounts = computed&lt;UnifiedAccount[]&gt;(() =&gt; {
1949
+ <span class="cstat-no" title="statement not covered" > });</span>
1950
+ <span class="cstat-no" title="statement not covered" ></span>
1951
+ <span class="cstat-no" title="statement not covered" > /** Accounts formatted as UnifiedAccount for compatibility */</span>
1952
+ <span class="cstat-no" title="statement not covered" > readonly unifiedAccounts = computed&lt;UnifiedAccount[]&gt;(() =&gt; {</span>
1953
1953
  <span class="cstat-no" title="statement not covered" > const accounts = this._accounts();</span>
1954
1954
  <span class="cstat-no" title="statement not covered" > const invite = this._currentInvite();</span>
1955
1955
  <span class="cstat-no" title="statement not covered" > if (!invite) return [];</span>
@@ -1975,30 +1975,30 @@ export class ChannelClientService {
1975
1975
  <span class="cstat-no" title="statement not covered" > },</span>
1976
1976
  <span class="cstat-no" title="statement not covered" > };</span>
1977
1977
  <span class="cstat-no" title="statement not covered" > });</span>
1978
- });
1979
- &nbsp;
1980
- /**
1981
- *
1982
- */
1983
- constructor() {
1984
- // Note: Auto-restore is intentionally NOT called here.
1985
- // Session lifecycle (connect/disconnect/restore) is controlled by
1986
- // HsuiteNativeProvider, which calls attemptRestore() as needed.
1987
- // This keeps ChannelClientService as a passive wrapper.
1988
- }
1989
- &nbsp;
1990
- // ============================================================================
1991
- // Public API
1992
- // ============================================================================
1993
- &nbsp;
1994
- /**
1995
- * Establish a new channel connection.
1996
- * Returns the invite to share with the wallet (via QR code or deep link).
1997
- *
1998
- * @param config - Channel configuration
1999
- * @returns The channel invite for wallet scanning
2000
- */
2001
- <span class="fstat-no" title="function not covered" > async connect(config: ChannelConnectConfig): Promise&lt;ChannelInvite&gt; {</span>
1978
+ <span class="cstat-no" title="statement not covered" > });</span>
1979
+ <span class="cstat-no" title="statement not covered" ></span>
1980
+ <span class="cstat-no" title="statement not covered" > /**</span>
1981
+ <span class="cstat-no" title="statement not covered" > *</span>
1982
+ <span class="cstat-no" title="statement not covered" > */</span>
1983
+ <span class="cstat-no" title="statement not covered" > constructor() {</span>
1984
+ <span class="cstat-no" title="statement not covered" > // Note: Auto-restore is intentionally NOT called here.</span>
1985
+ <span class="cstat-no" title="statement not covered" > // Session lifecycle (connect/disconnect/restore) is controlled by</span>
1986
+ <span class="cstat-no" title="statement not covered" > // HsuiteNativeProvider, which calls attemptRestore() as needed.</span>
1987
+ <span class="cstat-no" title="statement not covered" > // This keeps ChannelClientService as a passive wrapper.</span>
1988
+ <span class="cstat-no" title="statement not covered" > }</span>
1989
+ <span class="cstat-no" title="statement not covered" ></span>
1990
+ <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
1991
+ <span class="cstat-no" title="statement not covered" > // Public API</span>
1992
+ <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
1993
+ <span class="cstat-no" title="statement not covered" ></span>
1994
+ <span class="cstat-no" title="statement not covered" > /**</span>
1995
+ <span class="cstat-no" title="statement not covered" > * Establish a new channel connection.</span>
1996
+ <span class="cstat-no" title="statement not covered" > * Returns the invite to share with the wallet (via QR code or deep link).</span>
1997
+ <span class="cstat-no" title="statement not covered" > *</span>
1998
+ <span class="cstat-no" title="statement not covered" > * @param config - Channel configuration</span>
1999
+ <span class="cstat-no" title="statement not covered" > * @returns The channel invite for wallet scanning</span>
2000
+ <span class="cstat-no" title="statement not covered" > */</span>
2001
+ <span class="cstat-no" title="statement not covered" > async connect(config: ChannelConnectConfig): Promise&lt;ChannelInvite&gt; {</span>
2002
2002
  <span class="cstat-no" title="statement not covered" > if (this._state() === 'connecting' || this._state() === 'pending') {</span>
2003
2003
  <span class="cstat-no" title="statement not covered" > logger.warn('Connection already in progress');</span>
2004
2004
  <span class="cstat-no" title="statement not covered" > const existing = this._currentInvite();</span>
@@ -2151,33 +2151,33 @@ export class ChannelClientService {
2151
2151
  <span class="cstat-no" title="statement not covered" > throw error;</span>
2152
2152
  <span class="cstat-no" title="statement not covered" > }</span>
2153
2153
  <span class="cstat-no" title="statement not covered" > }</span>
2154
- &nbsp;
2155
- /**
2156
- * Generate a wallet invite URL for the current channel.
2157
- *
2158
- * @param invite - The channel invite (defaults to current)
2159
- * @param walletUrl - Base URL of the wallet
2160
- * @returns Full URL with invite parameter
2161
- */
2162
- getWalletInviteUrl(invite?: ChannelInvite, walletUrl = DEFAULT_WALLET_URL): string {
2163
- const inv = <span class="branch-0 cbranch-no" title="branch not covered" >invite ?? this._currentInvite();</span>
2164
- if (!inv) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2154
+ <span class="cstat-no" title="statement not covered" ></span>
2155
+ <span class="cstat-no" title="statement not covered" > /**</span>
2156
+ <span class="cstat-no" title="statement not covered" > * Generate a wallet invite URL for the current channel.</span>
2157
+ <span class="cstat-no" title="statement not covered" > *</span>
2158
+ <span class="cstat-no" title="statement not covered" > * @param invite - The channel invite (defaults to current)</span>
2159
+ <span class="cstat-no" title="statement not covered" > * @param walletUrl - Base URL of the wallet</span>
2160
+ <span class="cstat-no" title="statement not covered" > * @returns Full URL with invite parameter</span>
2161
+ <span class="cstat-no" title="statement not covered" > */</span>
2162
+ <span class="cstat-no" title="statement not covered" > getWalletInviteUrl(invite?: ChannelInvite, walletUrl = DEFAULT_WALLET_URL): string {</span>
2163
+ <span class="cstat-no" title="statement not covered" > const inv = invite ?? this._currentInvite();</span>
2164
+ <span class="cstat-no" title="statement not covered" > if (!inv) {</span>
2165
2165
  <span class="cstat-no" title="statement not covered" > throw new Error('No active invite');</span>
2166
2166
  <span class="cstat-no" title="statement not covered" > }</span>
2167
- &nbsp;
2168
- const encoded = encodeChannelInvite(inv);
2169
- return `${walletUrl}?hsuite_invite=${encodeURIComponent(encoded)}`;
2170
- }
2171
- &nbsp;
2172
- /**
2173
- * Send an RPC request to the wallet.
2174
- *
2175
- * @param method - RPC method name
2176
- * @param params - Method parameters
2177
- * @param timeoutMs - Request timeout (default: 60s)
2178
- * @returns The RPC response
2179
- */
2180
- <span class="fstat-no" title="function not covered" > async request&lt;T = unknown&gt;(</span>
2167
+ <span class="cstat-no" title="statement not covered" ></span>
2168
+ <span class="cstat-no" title="statement not covered" > const encoded = encodeChannelInvite(inv);</span>
2169
+ <span class="cstat-no" title="statement not covered" > return `${walletUrl}?hsuite_invite=${encodeURIComponent(encoded)}`;</span>
2170
+ <span class="cstat-no" title="statement not covered" > }</span>
2171
+ <span class="cstat-no" title="statement not covered" ></span>
2172
+ <span class="cstat-no" title="statement not covered" > /**</span>
2173
+ <span class="cstat-no" title="statement not covered" > * Send an RPC request to the wallet.</span>
2174
+ <span class="cstat-no" title="statement not covered" > *</span>
2175
+ <span class="cstat-no" title="statement not covered" > * @param method - RPC method name</span>
2176
+ <span class="cstat-no" title="statement not covered" > * @param params - Method parameters</span>
2177
+ <span class="cstat-no" title="statement not covered" > * @param timeoutMs - Request timeout (default: 60s)</span>
2178
+ <span class="cstat-no" title="statement not covered" > * @returns The RPC response</span>
2179
+ <span class="cstat-no" title="statement not covered" > */</span>
2180
+ <span class="cstat-no" title="statement not covered" > async request&lt;T = unknown&gt;(</span>
2181
2181
  <span class="cstat-no" title="statement not covered" > method: string,</span>
2182
2182
  <span class="cstat-no" title="statement not covered" > params: Record&lt;string, unknown&gt;,</span>
2183
2183
  <span class="cstat-no" title="statement not covered" > timeoutMs = 60000,</span>
@@ -2197,22 +2197,22 @@ export class ChannelClientService {
2197
2197
  <span class="cstat-no" title="statement not covered" ></span>
2198
2198
  <span class="cstat-no" title="statement not covered" > return this.client.request&lt;T&gt;(method, params, timeoutMs);</span>
2199
2199
  <span class="cstat-no" title="statement not covered" > }</span>
2200
- &nbsp;
2201
- /**
2202
- * Sign a transaction via the wallet.
2203
- *
2204
- * @param options
2205
- * @param accountAddress - Signer account address
2206
- * @param options.accountAddress
2207
- * @param options.payload
2208
- * @param options.ledgerId
2209
- * @param options.networkId
2210
- * @param payload - Transaction payload (base64 or hex)
2211
- * @param ledgerId - Optional ledger override
2212
- * @param networkId - Optional network override
2213
- * @returns Sign result with signature
2214
- */
2215
- <span class="fstat-no" title="function not covered" > async signTransaction(options: {</span>
2200
+ <span class="cstat-no" title="statement not covered" ></span>
2201
+ <span class="cstat-no" title="statement not covered" > /**</span>
2202
+ <span class="cstat-no" title="statement not covered" > * Sign a transaction via the wallet.</span>
2203
+ <span class="cstat-no" title="statement not covered" > *</span>
2204
+ <span class="cstat-no" title="statement not covered" > * @param options</span>
2205
+ <span class="cstat-no" title="statement not covered" > * @param accountAddress - Signer account address</span>
2206
+ <span class="cstat-no" title="statement not covered" > * @param options.accountAddress</span>
2207
+ <span class="cstat-no" title="statement not covered" > * @param options.payload</span>
2208
+ <span class="cstat-no" title="statement not covered" > * @param options.ledgerId</span>
2209
+ <span class="cstat-no" title="statement not covered" > * @param options.networkId</span>
2210
+ <span class="cstat-no" title="statement not covered" > * @param payload - Transaction payload (base64 or hex)</span>
2211
+ <span class="cstat-no" title="statement not covered" > * @param ledgerId - Optional ledger override</span>
2212
+ <span class="cstat-no" title="statement not covered" > * @param networkId - Optional network override</span>
2213
+ <span class="cstat-no" title="statement not covered" > * @returns Sign result with signature</span>
2214
+ <span class="cstat-no" title="statement not covered" > */</span>
2215
+ <span class="cstat-no" title="statement not covered" > async signTransaction(options: {</span>
2216
2216
  <span class="cstat-no" title="statement not covered" > accountAddress: string;</span>
2217
2217
  <span class="cstat-no" title="statement not covered" > payload: string;</span>
2218
2218
  <span class="cstat-no" title="statement not covered" > ledgerId?: string;</span>
@@ -2236,25 +2236,25 @@ export class ChannelClientService {
2236
2236
  <span class="cstat-no" title="statement not covered" > metadata: response.metadata,</span>
2237
2237
  <span class="cstat-no" title="statement not covered" > };</span>
2238
2238
  <span class="cstat-no" title="statement not covered" > }</span>
2239
- &nbsp;
2240
- /**
2241
- * Sign and submit a transaction in one call (single prompt).
2242
- *
2243
- * @param options
2244
- * @param accountAddress - Signer account address
2245
- * @param options.accountAddress
2246
- * @param options.payload
2247
- * @param options.ledgerId
2248
- * @param options.networkId
2249
- * @param options.isBatch
2250
- * @param options.batchKey
2251
- * @param options.innerTransactions
2252
- * @param payload - Transaction payload
2253
- * @param ledgerId - Optional ledger override
2254
- * @param networkId - Optional network override
2255
- * @returns Submit result with transaction ID
2256
- */
2257
- <span class="fstat-no" title="function not covered" > async signAndSubmitTransaction(options: {</span>
2239
+ <span class="cstat-no" title="statement not covered" ></span>
2240
+ <span class="cstat-no" title="statement not covered" > /**</span>
2241
+ <span class="cstat-no" title="statement not covered" > * Sign and submit a transaction in one call (single prompt).</span>
2242
+ <span class="cstat-no" title="statement not covered" > *</span>
2243
+ <span class="cstat-no" title="statement not covered" > * @param options</span>
2244
+ <span class="cstat-no" title="statement not covered" > * @param accountAddress - Signer account address</span>
2245
+ <span class="cstat-no" title="statement not covered" > * @param options.accountAddress</span>
2246
+ <span class="cstat-no" title="statement not covered" > * @param options.payload</span>
2247
+ <span class="cstat-no" title="statement not covered" > * @param options.ledgerId</span>
2248
+ <span class="cstat-no" title="statement not covered" > * @param options.networkId</span>
2249
+ <span class="cstat-no" title="statement not covered" > * @param options.isBatch</span>
2250
+ <span class="cstat-no" title="statement not covered" > * @param options.batchKey</span>
2251
+ <span class="cstat-no" title="statement not covered" > * @param options.innerTransactions</span>
2252
+ <span class="cstat-no" title="statement not covered" > * @param payload - Transaction payload</span>
2253
+ <span class="cstat-no" title="statement not covered" > * @param ledgerId - Optional ledger override</span>
2254
+ <span class="cstat-no" title="statement not covered" > * @param networkId - Optional network override</span>
2255
+ <span class="cstat-no" title="statement not covered" > * @returns Submit result with transaction ID</span>
2256
+ <span class="cstat-no" title="statement not covered" > */</span>
2257
+ <span class="cstat-no" title="statement not covered" > async signAndSubmitTransaction(options: {</span>
2258
2258
  <span class="cstat-no" title="statement not covered" > accountAddress: string;</span>
2259
2259
  <span class="cstat-no" title="statement not covered" > payload: string;</span>
2260
2260
  <span class="cstat-no" title="statement not covered" > ledgerId?: string;</span>
@@ -2291,11 +2291,11 @@ export class ChannelClientService {
2291
2291
  <span class="cstat-no" title="statement not covered" > metadata: response.metadata,</span>
2292
2292
  <span class="cstat-no" title="statement not covered" > };</span>
2293
2293
  <span class="cstat-no" title="statement not covered" > }</span>
2294
- &nbsp;
2295
- /**
2296
- * Disconnect from the wallet.
2297
- */
2298
- <span class="fstat-no" title="function not covered" > async disconnect(): Promise&lt;void&gt; {</span>
2294
+ <span class="cstat-no" title="statement not covered" ></span>
2295
+ <span class="cstat-no" title="statement not covered" > /**</span>
2296
+ <span class="cstat-no" title="statement not covered" > * Disconnect from the wallet.</span>
2297
+ <span class="cstat-no" title="statement not covered" > */</span>
2298
+ <span class="cstat-no" title="statement not covered" > async disconnect(): Promise&lt;void&gt; {</span>
2299
2299
  <span class="cstat-no" title="statement not covered" > // Stop state polling first</span>
2300
2300
  <span class="cstat-no" title="statement not covered" > this.stopStateSync();</span>
2301
2301
  <span class="cstat-no" title="statement not covered" ></span>
@@ -2320,16 +2320,16 @@ export class ChannelClientService {
2320
2320
  <span class="cstat-no" title="statement not covered" ></span>
2321
2321
  <span class="cstat-no" title="statement not covered" > logger.info('Disconnected from channel');</span>
2322
2322
  <span class="cstat-no" title="statement not covered" > }</span>
2323
- &nbsp;
2324
- /**
2325
- * Attempt to restore a previous session.
2326
- *
2327
- * Note: This method is called by HsuiteNativeProvider as the single point
2328
- * of session lifecycle control. Do not call from multiple places.
2329
- *
2330
- * @returns True if restoration was successful
2331
- */
2332
- <span class="fstat-no" title="function not covered" > async attemptRestore(): Promise&lt;boolean&gt; {</span>
2323
+ <span class="cstat-no" title="statement not covered" ></span>
2324
+ <span class="cstat-no" title="statement not covered" > /**</span>
2325
+ <span class="cstat-no" title="statement not covered" > * Attempt to restore a previous session.</span>
2326
+ <span class="cstat-no" title="statement not covered" > *</span>
2327
+ <span class="cstat-no" title="statement not covered" > * Note: This method is called by HsuiteNativeProvider as the single point</span>
2328
+ <span class="cstat-no" title="statement not covered" > * of session lifecycle control. Do not call from multiple places.</span>
2329
+ <span class="cstat-no" title="statement not covered" > *</span>
2330
+ <span class="cstat-no" title="statement not covered" > * @returns True if restoration was successful</span>
2331
+ <span class="cstat-no" title="statement not covered" > */</span>
2332
+ <span class="cstat-no" title="statement not covered" > async attemptRestore(): Promise&lt;boolean&gt; {</span>
2333
2333
  <span class="cstat-no" title="statement not covered" > // Skip restore if a new connection is being initiated</span>
2334
2334
  <span class="cstat-no" title="statement not covered" > if (this.connectingNewSession) {</span>
2335
2335
  <span class="cstat-no" title="statement not covered" > logger.debug('Skipping restore - new connection in progress');</span>
@@ -2451,32 +2451,32 @@ export class ChannelClientService {
2451
2451
  <span class="cstat-no" title="statement not covered" > return false;</span>
2452
2452
  <span class="cstat-no" title="statement not covered" > }</span>
2453
2453
  <span class="cstat-no" title="statement not covered" > }</span>
2454
- &nbsp;
2455
- // ============================================================================
2456
- // Private Methods
2457
- // ============================================================================
2458
- &nbsp;
2459
- /**
2460
- * Run a function inside NgZone for proper change detection.
2461
- * @param fn
2462
- */
2463
- private <span class="fstat-no" title="function not covered" >runInZone(fn: () =&gt; void): void {</span>
2454
+ <span class="cstat-no" title="statement not covered" ></span>
2455
+ <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
2456
+ <span class="cstat-no" title="statement not covered" > // Private Methods</span>
2457
+ <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
2458
+ <span class="cstat-no" title="statement not covered" ></span>
2459
+ <span class="cstat-no" title="statement not covered" > /**</span>
2460
+ <span class="cstat-no" title="statement not covered" > * Run a function inside NgZone for proper change detection.</span>
2461
+ <span class="cstat-no" title="statement not covered" > * @param fn</span>
2462
+ <span class="cstat-no" title="statement not covered" > */</span>
2463
+ <span class="cstat-no" title="statement not covered" > private runInZone(fn: () =&gt; void): void {</span>
2464
2464
  <span class="cstat-no" title="statement not covered" > if (this.zone) {</span>
2465
2465
  <span class="cstat-no" title="statement not covered" > this.zone.run(fn);</span>
2466
2466
  <span class="cstat-no" title="statement not covered" > } else {</span>
2467
2467
  <span class="cstat-no" title="statement not covered" > fn();</span>
2468
2468
  <span class="cstat-no" title="statement not covered" > }</span>
2469
2469
  <span class="cstat-no" title="statement not covered" > }</span>
2470
- &nbsp;
2471
- /** Current polling timeout ID for cleanup */
2472
- private pollingTimeoutId?: ReturnType&lt;typeof setTimeout&gt;;
2473
- &nbsp;
2474
- /**
2475
- * Set up state synchronization from the underlying client.
2476
- * Polling continues as long as the client exists - it doesn't stop on disconnect/error
2477
- * to properly track state changes during reconnection.
2478
- */
2479
- private <span class="fstat-no" title="function not covered" >setupStateSync(): void {</span>
2470
+ <span class="cstat-no" title="statement not covered" ></span>
2471
+ <span class="cstat-no" title="statement not covered" > /** Current polling timeout ID for cleanup */</span>
2472
+ <span class="cstat-no" title="statement not covered" > private pollingTimeoutId?: ReturnType&lt;typeof setTimeout&gt;;</span>
2473
+ <span class="cstat-no" title="statement not covered" ></span>
2474
+ <span class="cstat-no" title="statement not covered" > /**</span>
2475
+ <span class="cstat-no" title="statement not covered" > * Set up state synchronization from the underlying client.</span>
2476
+ <span class="cstat-no" title="statement not covered" > * Polling continues as long as the client exists - it doesn't stop on disconnect/error</span>
2477
+ <span class="cstat-no" title="statement not covered" > * to properly track state changes during reconnection.</span>
2478
+ <span class="cstat-no" title="statement not covered" > */</span>
2479
+ <span class="cstat-no" title="statement not covered" > private setupStateSync(): void {</span>
2480
2480
  <span class="cstat-no" title="statement not covered" > if (!this.client) return;</span>
2481
2481
  <span class="cstat-no" title="statement not covered" ></span>
2482
2482
  <span class="cstat-no" title="statement not covered" > // Clear any existing polling</span>
@@ -2547,27 +2547,27 @@ export class ChannelClientService {
2547
2547
  <span class="cstat-no" title="statement not covered" ></span>
2548
2548
  <span class="cstat-no" title="statement not covered" > this.pollingTimeoutId = setTimeout(checkState, 100);</span>
2549
2549
  <span class="cstat-no" title="statement not covered" > }</span>
2550
- &nbsp;
2551
- /**
2552
- * Stop state synchronization polling.
2553
- */
2554
- private <span class="fstat-no" title="function not covered" >stopStateSync(): void {</span>
2550
+ <span class="cstat-no" title="statement not covered" ></span>
2551
+ <span class="cstat-no" title="statement not covered" > /**</span>
2552
+ <span class="cstat-no" title="statement not covered" > * Stop state synchronization polling.</span>
2553
+ <span class="cstat-no" title="statement not covered" > */</span>
2554
+ <span class="cstat-no" title="statement not covered" > private stopStateSync(): void {</span>
2555
2555
  <span class="cstat-no" title="statement not covered" > if (this.pollingTimeoutId) {</span>
2556
2556
  <span class="cstat-no" title="statement not covered" > clearTimeout(this.pollingTimeoutId);</span>
2557
2557
  <span class="cstat-no" title="statement not covered" > this.pollingTimeoutId = undefined;</span>
2558
2558
  <span class="cstat-no" title="statement not covered" > }</span>
2559
2559
  <span class="cstat-no" title="statement not covered" > }</span>
2560
- &nbsp;
2561
- // ============================================================================
2562
- // Storage
2563
- // ============================================================================
2564
- &nbsp;
2565
- private static readonly STORAGE_KEY = 'hsuite_channel_persisted';
2566
- &nbsp;
2567
- /**
2568
- * Persist current state for reconnection after approval.
2569
- */
2570
- private <span class="fstat-no" title="function not covered" >persistCurrentState(): void {</span>
2560
+ <span class="cstat-no" title="statement not covered" ></span>
2561
+ <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
2562
+ <span class="cstat-no" title="statement not covered" > // Storage</span>
2563
+ <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
2564
+ <span class="cstat-no" title="statement not covered" ></span>
2565
+ <span class="cstat-no" title="statement not covered" > private static readonly STORAGE_KEY = 'hsuite_channel_persisted';</span>
2566
+ <span class="cstat-no" title="statement not covered" ></span>
2567
+ <span class="cstat-no" title="statement not covered" > /**</span>
2568
+ <span class="cstat-no" title="statement not covered" > * Persist current state for reconnection after approval.</span>
2569
+ <span class="cstat-no" title="statement not covered" > */</span>
2570
+ <span class="cstat-no" title="statement not covered" > private persistCurrentState(): void {</span>
2571
2571
  <span class="cstat-no" title="statement not covered" > if (!this.client) return;</span>
2572
2572
  <span class="cstat-no" title="statement not covered" > try {</span>
2573
2573
  <span class="cstat-no" title="statement not covered" > const persisted = this.client.exportState();</span>
@@ -2582,13 +2582,13 @@ export class ChannelClientService {
2582
2582
  <span class="cstat-no" title="statement not covered" > logger.warn('Failed to persist channel state', { error });</span>
2583
2583
  <span class="cstat-no" title="statement not covered" > }</span>
2584
2584
  <span class="cstat-no" title="statement not covered" > }</span>
2585
- &nbsp;
2586
- /**
2587
- * Store channel state for reconnection.
2588
- * Uses client's exportState() to get proper PersistedChannel format.
2589
- * @param invite
2590
- */
2591
- private <span class="fstat-no" title="function not covered" >storeInvite(invite: ChannelInvite): void {</span>
2585
+ <span class="cstat-no" title="statement not covered" ></span>
2586
+ <span class="cstat-no" title="statement not covered" > /**</span>
2587
+ <span class="cstat-no" title="statement not covered" > * Store channel state for reconnection.</span>
2588
+ <span class="cstat-no" title="statement not covered" > * Uses client's exportState() to get proper PersistedChannel format.</span>
2589
+ <span class="cstat-no" title="statement not covered" > * @param invite</span>
2590
+ <span class="cstat-no" title="statement not covered" > */</span>
2591
+ <span class="cstat-no" title="statement not covered" > private storeInvite(invite: ChannelInvite): void {</span>
2592
2592
  <span class="cstat-no" title="statement not covered" > try {</span>
2593
2593
  <span class="cstat-no" title="statement not covered" > // Use the client's exportState if available, otherwise create minimal persisted data</span>
2594
2594
  <span class="cstat-no" title="statement not covered" > const persisted = this.client?.exportState();</span>
@@ -2622,11 +2622,11 @@ export class ChannelClientService {
2622
2622
  <span class="cstat-no" title="statement not covered" > logger.warn('Failed to store channel');</span>
2623
2623
  <span class="cstat-no" title="statement not covered" > }</span>
2624
2624
  <span class="cstat-no" title="statement not covered" > }</span>
2625
- &nbsp;
2626
- /**
2627
- * Retrieve stored channel for reconnection.
2628
- */
2629
- private <span class="fstat-no" title="function not covered" >getStoredChannel(): PersistedChannel | null {</span>
2625
+ <span class="cstat-no" title="statement not covered" ></span>
2626
+ <span class="cstat-no" title="statement not covered" > /**</span>
2627
+ <span class="cstat-no" title="statement not covered" > * Retrieve stored channel for reconnection.</span>
2628
+ <span class="cstat-no" title="statement not covered" > */</span>
2629
+ <span class="cstat-no" title="statement not covered" > private getStoredChannel(): PersistedChannel | null {</span>
2630
2630
  <span class="cstat-no" title="statement not covered" > try {</span>
2631
2631
  <span class="cstat-no" title="statement not covered" > const stored = localStorage.getItem(ChannelClientService.STORAGE_KEY);</span>
2632
2632
  <span class="cstat-no" title="statement not covered" > if (stored) {</span>
@@ -2637,18 +2637,18 @@ export class ChannelClientService {
2637
2637
  <span class="cstat-no" title="statement not covered" > }</span>
2638
2638
  <span class="cstat-no" title="statement not covered" > return null;</span>
2639
2639
  <span class="cstat-no" title="statement not covered" > }</span>
2640
- &nbsp;
2641
- /**
2642
- * Clear stored channel data.
2643
- */
2644
- private <span class="fstat-no" title="function not covered" >clearStoredChannel(): void {</span>
2640
+ <span class="cstat-no" title="statement not covered" ></span>
2641
+ <span class="cstat-no" title="statement not covered" > /**</span>
2642
+ <span class="cstat-no" title="statement not covered" > * Clear stored channel data.</span>
2643
+ <span class="cstat-no" title="statement not covered" > */</span>
2644
+ <span class="cstat-no" title="statement not covered" > private clearStoredChannel(): void {</span>
2645
2645
  <span class="cstat-no" title="statement not covered" > try {</span>
2646
2646
  <span class="cstat-no" title="statement not covered" > localStorage.removeItem(ChannelClientService.STORAGE_KEY);</span>
2647
2647
  <span class="cstat-no" title="statement not covered" > } catch {</span>
2648
2648
  <span class="cstat-no" title="statement not covered" > // Ignore</span>
2649
2649
  <span class="cstat-no" title="statement not covered" > }</span>
2650
2650
  <span class="cstat-no" title="statement not covered" > }</span>
2651
- }
2651
+ <span class="cstat-no" title="statement not covered" >}</span>
2652
2652
  &nbsp;</pre></td></tr></table></pre>
2653
2653
 
2654
2654
  <div class='push'></div><!-- for sticky footer -->
@@ -2656,7 +2656,7 @@ export class ChannelClientService {
2656
2656
  <div class='footer quiet pad2 space-top1 center small'>
2657
2657
  Code coverage generated by
2658
2658
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2659
- at 2026-06-02T14:30:38.257Z
2659
+ at 2026-06-10T09:00:36.727Z
2660
2660
  </div>
2661
2661
  <script src="../../../prettify.js"></script>
2662
2662
  <script>