@aztec/wallet-sdk 0.0.1-commit.b6e433891 → 0.0.1-commit.b9865e97

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 (71) hide show
  1. package/README.md +125 -0
  2. package/dest/base-wallet/base_wallet.d.ts +51 -40
  3. package/dest/base-wallet/base_wallet.d.ts.map +1 -1
  4. package/dest/base-wallet/base_wallet.js +147 -75
  5. package/dest/base-wallet/index.d.ts +2 -2
  6. package/dest/base-wallet/index.d.ts.map +1 -1
  7. package/dest/base-wallet/utils.d.ts +7 -4
  8. package/dest/base-wallet/utils.d.ts.map +1 -1
  9. package/dest/base-wallet/utils.js +11 -5
  10. package/dest/crypto.d.ts +39 -1
  11. package/dest/crypto.d.ts.map +1 -1
  12. package/dest/crypto.js +88 -0
  13. package/dest/extension/handlers/background_connection_handler.d.ts +12 -2
  14. package/dest/extension/handlers/background_connection_handler.d.ts.map +1 -1
  15. package/dest/extension/handlers/background_connection_handler.js +44 -8
  16. package/dest/extension/handlers/content_script_connection_handler.d.ts +2 -1
  17. package/dest/extension/handlers/content_script_connection_handler.d.ts.map +1 -1
  18. package/dest/extension/handlers/content_script_connection_handler.js +19 -0
  19. package/dest/extension/handlers/internal_message_types.d.ts +3 -1
  20. package/dest/extension/handlers/internal_message_types.d.ts.map +1 -1
  21. package/dest/extension/handlers/internal_message_types.js +3 -1
  22. package/dest/extension/provider/extension_wallet.d.ts +26 -6
  23. package/dest/extension/provider/extension_wallet.d.ts.map +1 -1
  24. package/dest/extension/provider/extension_wallet.js +80 -9
  25. package/dest/extension/provider/index.d.ts +2 -2
  26. package/dest/extension/provider/index.d.ts.map +1 -1
  27. package/dest/iframe/handlers/iframe_connection_handler.d.ts +122 -0
  28. package/dest/iframe/handlers/iframe_connection_handler.d.ts.map +1 -0
  29. package/dest/iframe/handlers/iframe_connection_handler.js +239 -0
  30. package/dest/iframe/handlers/index.d.ts +2 -0
  31. package/dest/iframe/handlers/index.d.ts.map +1 -0
  32. package/dest/iframe/handlers/index.js +1 -0
  33. package/dest/iframe/provider/iframe_discovery.d.ts +25 -0
  34. package/dest/iframe/provider/iframe_discovery.d.ts.map +1 -0
  35. package/dest/iframe/provider/iframe_discovery.js +167 -0
  36. package/dest/iframe/provider/iframe_provider.d.ts +65 -0
  37. package/dest/iframe/provider/iframe_provider.d.ts.map +1 -0
  38. package/dest/iframe/provider/iframe_provider.js +257 -0
  39. package/dest/iframe/provider/iframe_wallet.d.ts +85 -0
  40. package/dest/iframe/provider/iframe_wallet.d.ts.map +1 -0
  41. package/dest/iframe/provider/iframe_wallet.js +269 -0
  42. package/dest/iframe/provider/index.d.ts +4 -0
  43. package/dest/iframe/provider/index.d.ts.map +1 -0
  44. package/dest/iframe/provider/index.js +3 -0
  45. package/dest/manager/types.d.ts +3 -2
  46. package/dest/manager/types.d.ts.map +1 -1
  47. package/dest/manager/wallet_manager.d.ts +1 -1
  48. package/dest/manager/wallet_manager.d.ts.map +1 -1
  49. package/dest/manager/wallet_manager.js +46 -16
  50. package/dest/types.d.ts +64 -2
  51. package/dest/types.d.ts.map +1 -1
  52. package/dest/types.js +29 -0
  53. package/package.json +12 -8
  54. package/src/base-wallet/base_wallet.ts +212 -121
  55. package/src/base-wallet/index.ts +6 -1
  56. package/src/base-wallet/utils.ts +15 -5
  57. package/src/crypto.ts +104 -0
  58. package/src/extension/handlers/background_connection_handler.ts +42 -9
  59. package/src/extension/handlers/content_script_connection_handler.ts +18 -0
  60. package/src/extension/handlers/internal_message_types.ts +2 -0
  61. package/src/extension/provider/extension_wallet.ts +94 -13
  62. package/src/extension/provider/index.ts +1 -1
  63. package/src/iframe/handlers/iframe_connection_handler.ts +341 -0
  64. package/src/iframe/handlers/index.ts +7 -0
  65. package/src/iframe/provider/iframe_discovery.ts +185 -0
  66. package/src/iframe/provider/iframe_provider.ts +331 -0
  67. package/src/iframe/provider/iframe_wallet.ts +323 -0
  68. package/src/iframe/provider/index.ts +3 -0
  69. package/src/manager/types.ts +2 -1
  70. package/src/manager/wallet_manager.ts +48 -14
  71. package/src/types.ts +72 -0
@@ -2,6 +2,7 @@ import type { ChainInfo } from '@aztec/aztec.js/account';
2
2
  import { promiseWithResolvers } from '@aztec/foundation/promise';
3
3
 
4
4
  import { type DiscoveredWallet, ExtensionProvider, ExtensionWallet } from '../extension/provider/index.js';
5
+ import { discoverWebWallets } from '../iframe/provider/iframe_discovery.js';
5
6
  import { WalletMessageType } from '../types.js';
6
7
  import type {
7
8
  DiscoverWalletsOptions,
@@ -88,6 +89,20 @@ export class WalletManager {
88
89
 
89
90
  const { promise: donePromise, resolve: resolveDone } = promiseWithResolvers<void>();
90
91
 
92
+ const pendingSources = new Set<string>();
93
+
94
+ const emit = (provider: WalletProvider) => {
95
+ options.onWalletDiscovered?.(provider);
96
+
97
+ if (pendingResolve) {
98
+ const resolve = pendingResolve;
99
+ pendingResolve = null;
100
+ resolve({ value: provider, done: false });
101
+ } else {
102
+ pendingProviders.push(provider);
103
+ }
104
+ };
105
+
91
106
  const markComplete = () => {
92
107
  completed = true;
93
108
  resolveDone();
@@ -98,7 +113,15 @@ export class WalletManager {
98
113
  }
99
114
  };
100
115
 
116
+ const sourceComplete = (source: string) => {
117
+ pendingSources.delete(source);
118
+ if (pendingSources.size === 0) {
119
+ markComplete();
120
+ }
121
+ };
122
+
101
123
  if (this.config.extensions?.enabled) {
124
+ pendingSources.add('extensions');
102
125
  const extensionConfig = this.config.extensions;
103
126
 
104
127
  void ExtensionProvider.discoverWallets(chainInfo, {
@@ -107,24 +130,35 @@ export class WalletManager {
107
130
  signal: abortController.signal,
108
131
  onWalletDiscovered: discoveredWallet => {
109
132
  const provider = this.createProviderFromDiscoveredWallet(discoveredWallet, chainInfo, extensionConfig);
110
- if (!provider) {
111
- return;
133
+ if (provider) {
134
+ emit(provider);
112
135
  }
136
+ },
137
+ }).then(() => sourceComplete('extensions'));
138
+ }
113
139
 
114
- // Call user's callback if provided
115
- options.onWalletDiscovered?.(provider);
140
+ if (this.config.webWallets?.urls && this.config.webWallets.urls.length > 0) {
141
+ pendingSources.add('webWallets');
142
+ const webSession = discoverWebWallets(this.config.webWallets.urls, chainInfo);
116
143
 
117
- // Also queue for async iterator
118
- if (pendingResolve) {
119
- const resolve = pendingResolve;
120
- pendingResolve = null;
121
- resolve({ value: provider, done: false });
122
- } else {
123
- pendingProviders.push(provider);
144
+ // Forward discovered web wallets into the shared iterator
145
+ void (async () => {
146
+ try {
147
+ for await (const provider of webSession.wallets) {
148
+ if (abortController.signal.aborted) {
149
+ break;
150
+ }
151
+ emit(provider);
124
152
  }
125
- },
126
- }).then(markComplete);
127
- } else {
153
+ } finally {
154
+ sourceComplete('webWallets');
155
+ }
156
+ })();
157
+
158
+ abortController.signal.addEventListener('abort', () => webSession.cancel(), { once: true });
159
+ }
160
+
161
+ if (pendingSources.size === 0) {
128
162
  markComplete();
129
163
  }
130
164
 
package/src/types.ts CHANGED
@@ -17,6 +17,21 @@ export enum WalletMessageType {
17
17
  KEY_EXCHANGE_REQUEST = 'aztec-wallet-key-exchange-request',
18
18
  /** Key exchange response sent over MessageChannel */
19
19
  KEY_EXCHANGE_RESPONSE = 'aztec-wallet-key-exchange-response',
20
+ /** Wallet ready signal */
21
+ WALLET_READY = 'aztec-wallet-ready',
22
+ /** Encrypted wallet message wrapper */
23
+ SECURE_MESSAGE = 'aztec-wallet-secure-message',
24
+ /** Encrypted wallet response wrapper */
25
+ SECURE_RESPONSE = 'aztec-wallet-secure-response',
26
+ /** Session disconnected notification */
27
+ SESSION_DISCONNECTED = 'aztec-wallet-session-disconnected',
28
+ /** Liveness probe sent by the dApp while a request is in flight */
29
+ PING = 'aztec-wallet-ping',
30
+ /** Liveness response from the wallet. Any inbound message (including a regular
31
+ * encrypted response) is treated as proof of liveness, so a missing PONG alone
32
+ * never trips disconnect — the dApp also resets its liveness timer on traffic.
33
+ */
34
+ PONG = 'aztec-wallet-pong',
20
35
  }
21
36
 
22
37
  /**
@@ -130,3 +145,60 @@ export interface KeyExchangeResponse {
130
145
  /** Wallet's ECDH public key for deriving shared secret */
131
146
  publicKey: ExportedPublicKey;
132
147
  }
148
+
149
+ /**
150
+ * Callback invoked when a wallet connection is disconnected.
151
+ */
152
+ export type DisconnectCallback = () => void;
153
+
154
+ /**
155
+ * Default heartbeat tuning shared by both transports.
156
+ *
157
+ * - `intervalMs`: how often the dApp sends PING probes while a request is in flight.
158
+ * - `deadAfterMs`: how long the channel can stay silent (no PONG, no encrypted
159
+ * response, no DISCONNECT) before the dApp declares the wallet unreachable
160
+ * and rejects all in-flight requests. Generous enough that long-running
161
+ * operations (proveTx, sendTx) on legacy wallets that don't reply to PING
162
+ * still succeed — any inbound traffic resets the timer.
163
+ */
164
+ export const DEFAULT_HEARTBEAT_INTERVAL_MS = 5_000;
165
+ export const DEFAULT_HEARTBEAT_DEAD_AFTER_MS = 300_000;
166
+
167
+ /** Override knobs for the heartbeat — mostly useful for tests. */
168
+ export interface HeartbeatOptions {
169
+ /** How often to send PING probes while a request is in flight (ms). */
170
+ intervalMs?: number;
171
+ /** Idle ceiling before declaring disconnect (ms). */
172
+ deadAfterMs?: number;
173
+ }
174
+
175
+ /**
176
+ * Minimal logger surface used by the wallet SDK.
177
+ *
178
+ * Defined locally so that wallet hosts (browser extensions, iframe wallet pages)
179
+ * can pass a simple `console`-backed logger without pulling in the full
180
+ * `@aztec/foundation` logging runtime, which is non-trivial to bundle in those
181
+ * contexts. Structurally compatible with `Logger` from `@aztec/foundation/log`,
182
+ * so dApp-side callers can pass that type directly.
183
+ */
184
+ export interface WalletSdkLogger {
185
+ /** Diagnostic messages — typically discarded in production. */
186
+ debug: (message: string, data?: unknown) => void;
187
+ /** Informational messages — significant lifecycle events. */
188
+ info: (message: string, data?: unknown) => void;
189
+ /** Recoverable problems — channel decryption failure, missed heartbeats, etc. */
190
+ warn: (message: string, data?: unknown) => void;
191
+ /** Errors that prevent normal operation. */
192
+ error: (message: string, errOrData?: unknown, data?: unknown) => void;
193
+ }
194
+
195
+ /**
196
+ * No-op logger used as the default when callers don't provide one. Discards all
197
+ * messages — wallet hosts that want diagnostics should pass their own logger.
198
+ */
199
+ export const NOOP_LOGGER: WalletSdkLogger = {
200
+ debug: () => {},
201
+ info: () => {},
202
+ warn: () => {},
203
+ error: () => {},
204
+ };