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