@meshconnect/uwc-bridge-child 0.0.4 → 0.1.1

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.
@@ -1,18 +1,12 @@
1
- import * as Comlink from 'comlink';
2
- interface ParentAPI {
3
- eip6963Wallets: unknown[];
4
- eip6963WalletsReady: boolean;
5
- walletStandardWallets: unknown[];
6
- walletStandardWalletsReady: boolean;
7
- }
8
1
  export declare class BridgeChild {
9
2
  private parentAPI?;
10
- constructor();
3
+ private tronInjectedIds;
4
+ private tronDiscoveryTriggered;
5
+ constructor(options?: {
6
+ tronInjectedIds?: string[];
7
+ });
11
8
  private initializeConnection;
12
9
  private pollForWallets;
13
10
  private checkWallets;
14
- getParentAPI(): Comlink.Remote<ParentAPI> | undefined;
15
- isConnected(): boolean;
16
11
  }
17
- export {};
18
12
  //# sourceMappingURL=BridgeChild.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BridgeChild.d.ts","sourceRoot":"","sources":["../src/BridgeChild.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAGlC,UAAU,SAAS;IACjB,cAAc,EAAE,OAAO,EAAE,CAAA;IACzB,mBAAmB,EAAE,OAAO,CAAA;IAC5B,qBAAqB,EAAE,OAAO,EAAE,CAAA;IAChC,0BAA0B,EAAE,OAAO,CAAA;CACpC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAC,CAA2B;;YAM/B,oBAAoB;YAapB,cAAc;YAiDd,YAAY;IA0D1B,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,SAAS;IAIrD,WAAW,IAAI,OAAO;CAGvB"}
1
+ {"version":3,"file":"BridgeChild.d.ts","sourceRoot":"","sources":["../src/BridgeChild.ts"],"names":[],"mappings":"AAgBA,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAC,CAA2B;IAC7C,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,sBAAsB,CAAQ;gBAE1B,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;YAKtC,oBAAoB;YAiBpB,cAAc;YAkDd,YAAY;CAwF3B"}
@@ -3,7 +3,10 @@
3
3
  import * as Comlink from 'comlink';
4
4
  export class BridgeChild {
5
5
  parentAPI;
6
- constructor() {
6
+ tronInjectedIds;
7
+ tronDiscoveryTriggered = false;
8
+ constructor(options) {
9
+ this.tronInjectedIds = options?.tronInjectedIds ?? [];
7
10
  this.initializeConnection();
8
11
  }
9
12
  async initializeConnection() {
@@ -11,7 +14,7 @@ export class BridgeChild {
11
14
  return;
12
15
  }
13
16
  window.UWCBridgeChildInitialized = true;
14
- this.parentAPI = Comlink.wrap(Comlink.windowEndpoint(window.parent, self, '*'));
17
+ this.parentAPI = Comlink.wrap(Comlink.windowEndpoint(window.parent, self, new URL(document.referrer).origin));
15
18
  this.pollForWallets();
16
19
  }
17
20
  async pollForWallets() {
@@ -26,7 +29,8 @@ export class BridgeChild {
26
29
  // Check if global variables are already set
27
30
  if ((window.eip6963Wallets && window.eip6963Wallets.length > 0) ||
28
31
  (window.walletStandardWallets &&
29
- window.walletStandardWallets.length > 0)) {
32
+ window.walletStandardWallets.length > 0) ||
33
+ (window.tronWallets && window.tronWallets.length > 0)) {
30
34
  return;
31
35
  }
32
36
  if (!this.parentAPI) {
@@ -35,7 +39,7 @@ export class BridgeChild {
35
39
  }
36
40
  // Create a timeout promise to prevent hanging
37
41
  const timeoutPromise = new Promise((_, reject) => {
38
- setTimeout(() => reject(new Error('Timeout accessing parent API')), 200);
42
+ setTimeout(() => reject(new Error('Timeout accessing parent API')), 100);
39
43
  });
40
44
  // Try to check wallets with a timeout
41
45
  Promise.race([this.checkWallets(), timeoutPromise])
@@ -56,7 +60,7 @@ export class BridgeChild {
56
60
  }
57
61
  async checkWallets() {
58
62
  try {
59
- // Check if both EIP6963 and Wallet Standard wallets are ready
63
+ // Check if EIP6963 and Wallet Standard wallets are ready
60
64
  const eip6963Ready = await this.parentAPI?.eip6963WalletsReady;
61
65
  const walletStandardReady = await this.parentAPI?.walletStandardWalletsReady;
62
66
  if (!eip6963Ready || !walletStandardReady) {
@@ -92,20 +96,43 @@ export class BridgeChild {
92
96
  walletStandardWallets.push(wallet);
93
97
  }
94
98
  }
95
- // Set both wallet types on window
99
+ // Get Tron wallets - wrapped in try/catch for backward compatibility
100
+ // with older BridgeParent versions that don't have Tron support
101
+ let tronWallets = [];
102
+ try {
103
+ if (!this.tronDiscoveryTriggered) {
104
+ await this.parentAPI?.discoverTronWallets?.(this.tronInjectedIds);
105
+ this.tronDiscoveryTriggered = true;
106
+ }
107
+ const tronReady = await this.parentAPI?.tronWalletsReady;
108
+ if (tronReady) {
109
+ const availableTronWallets = await this.parentAPI.tronWallets.length;
110
+ if (availableTronWallets > 0) {
111
+ for (let index = 0; index < availableTronWallets; index++) {
112
+ const wallet = {
113
+ uuid: await this.parentAPI.tronWallets[index].uuid,
114
+ name: await this.parentAPI.tronWallets[index].name,
115
+ injectedId: await this.parentAPI.tronWallets[index].injectedId,
116
+ provider: this.parentAPI.tronWallets[index].provider
117
+ };
118
+ tronWallets.push(wallet);
119
+ }
120
+ }
121
+ }
122
+ }
123
+ catch {
124
+ // Parent doesn't support Tron - use empty array
125
+ tronWallets = [];
126
+ }
127
+ // Set all wallet types on window
96
128
  window.eip6963Wallets = eip6963Wallets;
97
129
  window.walletStandardWallets = walletStandardWallets;
130
+ window.tronWallets = tronWallets;
98
131
  return 'stop';
99
132
  }
100
133
  catch {
101
134
  return 'continue';
102
135
  }
103
136
  }
104
- getParentAPI() {
105
- return this.parentAPI;
106
- }
107
- isConnected() {
108
- return this.parentAPI !== undefined;
109
- }
110
137
  }
111
138
  //# sourceMappingURL=BridgeChild.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BridgeChild.js","sourceRoot":"","sources":["../src/BridgeChild.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BridgeChild.js","sourceRoot":"","sources":["../src/BridgeChild.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=BridgeChild.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BridgeChild.test.d.ts","sourceRoot":"","sources":["../src/BridgeChild.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,395 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ // Create a mock parentAPI that simulates what Comlink.wrap returns
3
+ const createMockParentAPI = (opts = {}) => ({
4
+ eip6963WalletsReady: opts.eip6963Ready ?? true,
5
+ walletStandardWalletsReady: opts.walletStandardReady ?? true,
6
+ tronWalletsReady: opts.tronReady ?? true,
7
+ eip6963Wallets: opts.eip6963Wallets ?? [],
8
+ walletStandardWallets: opts.walletStandardWallets ?? [],
9
+ tronWallets: opts.tronWallets ?? [],
10
+ discoverTronWallets: vi.fn()
11
+ });
12
+ let mockWrappedAPI = null;
13
+ // Mock Comlink
14
+ vi.mock('comlink', () => ({
15
+ wrap: vi.fn(() => mockWrappedAPI),
16
+ windowEndpoint: vi.fn().mockReturnValue({})
17
+ }));
18
+ // Store original window properties
19
+ const originalParent = window.parent;
20
+ const originalReferrer = Object.getOwnPropertyDescriptor(document, 'referrer');
21
+ describe('BridgeChild', () => {
22
+ beforeEach(() => {
23
+ vi.clearAllMocks();
24
+ vi.useFakeTimers();
25
+ vi.resetModules();
26
+ // Reset window globals
27
+ delete window.UWCBridgeChildInitialized;
28
+ delete window.eip6963Wallets;
29
+ delete window.walletStandardWallets;
30
+ delete window.tronWallets;
31
+ mockWrappedAPI = createMockParentAPI();
32
+ // Mock document.referrer
33
+ Object.defineProperty(document, 'referrer', {
34
+ value: 'https://parent.example.com/page',
35
+ writable: true,
36
+ configurable: true
37
+ });
38
+ });
39
+ afterEach(() => {
40
+ vi.useRealTimers();
41
+ vi.restoreAllMocks();
42
+ // Cleanup window globals
43
+ delete window.UWCBridgeChildInitialized;
44
+ delete window.eip6963Wallets;
45
+ delete window.walletStandardWallets;
46
+ delete window.tronWallets;
47
+ // Restore document.referrer
48
+ if (originalReferrer) {
49
+ Object.defineProperty(document, 'referrer', originalReferrer);
50
+ }
51
+ });
52
+ // Helper to create a BridgeChild by simulating iframe context
53
+ const createBridgeChildInIframe = async (options) => {
54
+ // Mock window.parent to be different from window (iframe context)
55
+ Object.defineProperty(window, 'parent', {
56
+ value: { postMessage: vi.fn() },
57
+ writable: true,
58
+ configurable: true
59
+ });
60
+ const { BridgeChild } = await import('./BridgeChild');
61
+ const child = new BridgeChild(options);
62
+ // Restore parent after construction
63
+ Object.defineProperty(window, 'parent', {
64
+ value: originalParent,
65
+ writable: true,
66
+ configurable: true
67
+ });
68
+ return child;
69
+ };
70
+ describe('constructor', () => {
71
+ it('should accept empty options', async () => {
72
+ const child = await createBridgeChildInIframe();
73
+ expect(child).toBeDefined();
74
+ });
75
+ it('should accept tronInjectedIds option', async () => {
76
+ const child = await createBridgeChildInIframe({
77
+ tronInjectedIds: ['tronLink']
78
+ });
79
+ expect(child).toBeDefined();
80
+ });
81
+ });
82
+ describe('initializeConnection', () => {
83
+ it('should not initialize when window.parent equals window (not in iframe)', async () => {
84
+ const Comlink = await import('comlink');
85
+ // window.parent === window means we're NOT in an iframe
86
+ Object.defineProperty(window, 'parent', {
87
+ value: window,
88
+ writable: true,
89
+ configurable: true
90
+ });
91
+ const { BridgeChild } = await import('./BridgeChild');
92
+ new BridgeChild();
93
+ await vi.advanceTimersByTimeAsync(200);
94
+ expect(Comlink.wrap).not.toHaveBeenCalled();
95
+ expect(window.UWCBridgeChildInitialized).toBeUndefined();
96
+ Object.defineProperty(window, 'parent', {
97
+ value: originalParent,
98
+ writable: true,
99
+ configurable: true
100
+ });
101
+ });
102
+ it('should set UWCBridgeChildInitialized when in iframe', async () => {
103
+ await createBridgeChildInIframe();
104
+ expect(window.UWCBridgeChildInitialized).toBe(true);
105
+ });
106
+ it('should call Comlink.wrap and windowEndpoint', async () => {
107
+ const Comlink = await import('comlink');
108
+ await createBridgeChildInIframe();
109
+ expect(Comlink.windowEndpoint).toHaveBeenCalled();
110
+ expect(Comlink.wrap).toHaveBeenCalled();
111
+ });
112
+ });
113
+ describe('wallet polling', () => {
114
+ it('should set EIP6963 wallets on window when parent is ready', async () => {
115
+ const mockEip6963 = [
116
+ {
117
+ uuid: 'wallet-1',
118
+ name: 'MetaMask',
119
+ icon: 'mm-icon',
120
+ rdns: 'io.metamask',
121
+ provider: { request: vi.fn() }
122
+ }
123
+ ];
124
+ mockWrappedAPI = createMockParentAPI({
125
+ eip6963Wallets: mockEip6963
126
+ });
127
+ await createBridgeChildInIframe();
128
+ // Allow poll cycle to complete
129
+ await vi.advanceTimersByTimeAsync(500);
130
+ expect(window.eip6963Wallets).toBeDefined();
131
+ expect(window.eip6963Wallets).toHaveLength(1);
132
+ expect(window.eip6963Wallets[0].uuid).toBe('wallet-1');
133
+ });
134
+ it('should set Wallet Standard wallets on window', async () => {
135
+ const mockSolana = [
136
+ {
137
+ uuid: 'phantom-solana',
138
+ name: 'Phantom',
139
+ chains: ['solana:mainnet'],
140
+ features: ['standard:connect'],
141
+ adapter: {}
142
+ }
143
+ ];
144
+ mockWrappedAPI = createMockParentAPI({
145
+ walletStandardWallets: mockSolana
146
+ });
147
+ await createBridgeChildInIframe();
148
+ await vi.advanceTimersByTimeAsync(500);
149
+ expect(window.walletStandardWallets).toBeDefined();
150
+ expect(window.walletStandardWallets).toHaveLength(1);
151
+ expect(window.walletStandardWallets[0].name).toBe('Phantom');
152
+ });
153
+ it('should set Tron wallets on window', async () => {
154
+ const mockTron = [
155
+ {
156
+ uuid: 'tron-tronlink',
157
+ name: 'tronLink',
158
+ injectedId: 'tronLink',
159
+ provider: { tronWeb: {} }
160
+ }
161
+ ];
162
+ mockWrappedAPI = createMockParentAPI({
163
+ tronWallets: mockTron
164
+ });
165
+ await createBridgeChildInIframe({ tronInjectedIds: ['tronLink'] });
166
+ await vi.advanceTimersByTimeAsync(500);
167
+ expect(window.tronWallets).toBeDefined();
168
+ expect(window.tronWallets).toHaveLength(1);
169
+ expect(window.tronWallets[0].uuid).toBe('tron-tronlink');
170
+ });
171
+ it('should call discoverTronWallets with provided injectedIds', async () => {
172
+ mockWrappedAPI = createMockParentAPI();
173
+ await createBridgeChildInIframe({
174
+ tronInjectedIds: ['tronLink', 'tokenpocket.tron']
175
+ });
176
+ await vi.advanceTimersByTimeAsync(500);
177
+ expect(mockWrappedAPI.discoverTronWallets).toHaveBeenCalledWith([
178
+ 'tronLink',
179
+ 'tokenpocket.tron'
180
+ ]);
181
+ });
182
+ it('should continue polling when wallets are not ready', async () => {
183
+ mockWrappedAPI = createMockParentAPI({
184
+ eip6963Ready: false,
185
+ walletStandardReady: false,
186
+ tronReady: false
187
+ });
188
+ await createBridgeChildInIframe();
189
+ await vi.advanceTimersByTimeAsync(500);
190
+ // Window globals should NOT be set when not ready
191
+ expect(window.eip6963Wallets).toBeUndefined();
192
+ });
193
+ it('should stop polling when wallets are already set on window', async () => {
194
+ // Pre-set wallets on window
195
+ ;
196
+ window.eip6963Wallets = [{ uuid: 'existing' }];
197
+ mockWrappedAPI = createMockParentAPI();
198
+ await createBridgeChildInIframe();
199
+ await vi.advanceTimersByTimeAsync(500);
200
+ // discoverTronWallets should not be called since polling stopped early
201
+ expect(mockWrappedAPI.discoverTronWallets).not.toHaveBeenCalled();
202
+ });
203
+ it('should handle errors gracefully and continue polling', async () => {
204
+ // First call throws, subsequent calls succeed
205
+ let callCount = 0;
206
+ const failingAPI = {
207
+ get eip6963WalletsReady() {
208
+ callCount++;
209
+ if (callCount <= 1) {
210
+ throw new Error('API not ready');
211
+ }
212
+ return true;
213
+ },
214
+ walletStandardWalletsReady: true,
215
+ tronWalletsReady: true,
216
+ eip6963Wallets: [],
217
+ walletStandardWallets: [],
218
+ tronWallets: [],
219
+ discoverTronWallets: vi.fn()
220
+ };
221
+ mockWrappedAPI = failingAPI;
222
+ await createBridgeChildInIframe();
223
+ await vi.advanceTimersByTimeAsync(1000);
224
+ // Should eventually succeed and set wallets
225
+ expect(window.eip6963Wallets).toBeDefined();
226
+ });
227
+ });
228
+ describe('backward compatibility with older BridgeParent (no Tron)', () => {
229
+ it('should still set EVM and Solana wallets when parent has no Tron support', async () => {
230
+ const eip6963Wallets = [
231
+ {
232
+ uuid: 'mm-1',
233
+ name: 'MetaMask',
234
+ icon: 'mm-icon',
235
+ rdns: 'io.metamask',
236
+ provider: { request: vi.fn() }
237
+ }
238
+ ];
239
+ const walletStandardWallets = [
240
+ {
241
+ uuid: 'phantom-1',
242
+ name: 'Phantom',
243
+ chains: ['solana:mainnet'],
244
+ features: ['standard:connect'],
245
+ adapter: {}
246
+ }
247
+ ];
248
+ // Simulate old parent that throws on any Tron property access
249
+ const oldParentAPI = {
250
+ eip6963WalletsReady: true,
251
+ walletStandardWalletsReady: true,
252
+ eip6963Wallets,
253
+ walletStandardWallets,
254
+ get tronWalletsReady() {
255
+ throw new Error('tronWalletsReady is not defined');
256
+ },
257
+ get tronWallets() {
258
+ throw new Error('tronWallets is not defined');
259
+ },
260
+ get discoverTronWallets() {
261
+ return undefined;
262
+ }
263
+ };
264
+ mockWrappedAPI = oldParentAPI;
265
+ await createBridgeChildInIframe({ tronInjectedIds: ['tronLink'] });
266
+ await vi.advanceTimersByTimeAsync(500);
267
+ // EVM and Solana should still be set
268
+ expect(window.eip6963Wallets).toHaveLength(1);
269
+ expect(window.eip6963Wallets[0].uuid).toBe('mm-1');
270
+ expect(window.walletStandardWallets).toHaveLength(1);
271
+ expect(window.walletStandardWallets[0].name).toBe('Phantom');
272
+ // Tron should fall back to empty array
273
+ expect(window.tronWallets).toEqual([]);
274
+ });
275
+ it('should set tron to empty array when discoverTronWallets throws', async () => {
276
+ const apiWithBrokenDiscover = {
277
+ eip6963WalletsReady: true,
278
+ walletStandardWalletsReady: true,
279
+ eip6963Wallets: [],
280
+ walletStandardWallets: [],
281
+ tronWalletsReady: true,
282
+ tronWallets: [],
283
+ discoverTronWallets: vi.fn(() => {
284
+ throw new Error('Method not supported');
285
+ })
286
+ };
287
+ mockWrappedAPI = apiWithBrokenDiscover;
288
+ await createBridgeChildInIframe({ tronInjectedIds: ['tronLink'] });
289
+ await vi.advanceTimersByTimeAsync(500);
290
+ expect(window.eip6963Wallets).toEqual([]);
291
+ expect(window.walletStandardWallets).toEqual([]);
292
+ expect(window.tronWallets).toEqual([]);
293
+ });
294
+ it('should not block on tron when tronWalletsReady is false', async () => {
295
+ const eip6963Wallets = [
296
+ {
297
+ uuid: 'mm-1',
298
+ name: 'MetaMask',
299
+ icon: 'mm-icon',
300
+ rdns: 'io.metamask',
301
+ provider: { request: vi.fn() }
302
+ }
303
+ ];
304
+ mockWrappedAPI = createMockParentAPI({
305
+ eip6963Wallets,
306
+ tronReady: false,
307
+ tronWallets: []
308
+ });
309
+ await createBridgeChildInIframe();
310
+ await vi.advanceTimersByTimeAsync(500);
311
+ // EVM and Solana should be set even though tron is not ready
312
+ expect(window.eip6963Wallets).toHaveLength(1);
313
+ expect(window.walletStandardWallets).toEqual([]);
314
+ // Tron should be empty (not ready, so inner block skipped)
315
+ expect(window.tronWallets).toEqual([]);
316
+ });
317
+ it('should only call discoverTronWallets once across multiple polls', async () => {
318
+ // First poll: eip6963 not ready, so returns 'continue'
319
+ // Second poll: eip6963 ready, completes
320
+ let callCount = 0;
321
+ const progressiveAPI = {
322
+ get eip6963WalletsReady() {
323
+ callCount++;
324
+ return callCount > 1;
325
+ },
326
+ walletStandardWalletsReady: true,
327
+ tronWalletsReady: true,
328
+ eip6963Wallets: [],
329
+ walletStandardWallets: [],
330
+ tronWallets: [],
331
+ discoverTronWallets: vi.fn()
332
+ };
333
+ mockWrappedAPI = progressiveAPI;
334
+ await createBridgeChildInIframe({
335
+ tronInjectedIds: ['tronLink']
336
+ });
337
+ await vi.advanceTimersByTimeAsync(1000);
338
+ // discoverTronWallets should only be called once due to tronDiscoveryTriggered flag
339
+ expect(progressiveAPI.discoverTronWallets).toHaveBeenCalledTimes(1);
340
+ });
341
+ });
342
+ describe('checkWallets with all wallet types', () => {
343
+ it('should fetch all wallet types and set on window', async () => {
344
+ const eip6963Wallets = [
345
+ {
346
+ uuid: 'mm-1',
347
+ name: 'MetaMask',
348
+ icon: 'mm-icon',
349
+ rdns: 'io.metamask',
350
+ provider: { request: vi.fn() }
351
+ }
352
+ ];
353
+ const walletStandardWallets = [
354
+ {
355
+ uuid: 'phantom-1',
356
+ name: 'Phantom',
357
+ chains: ['solana:mainnet'],
358
+ features: ['standard:connect'],
359
+ adapter: { connect: vi.fn() }
360
+ }
361
+ ];
362
+ const tronWallets = [
363
+ {
364
+ uuid: 'tron-tronlink',
365
+ name: 'tronLink',
366
+ injectedId: 'tronLink',
367
+ provider: { tronWeb: {} }
368
+ }
369
+ ];
370
+ mockWrappedAPI = createMockParentAPI({
371
+ eip6963Wallets,
372
+ walletStandardWallets,
373
+ tronWallets
374
+ });
375
+ await createBridgeChildInIframe({ tronInjectedIds: ['tronLink'] });
376
+ await vi.advanceTimersByTimeAsync(500);
377
+ expect(window.eip6963Wallets).toHaveLength(1);
378
+ expect(window.walletStandardWallets).toHaveLength(1);
379
+ expect(window.tronWallets).toHaveLength(1);
380
+ });
381
+ it('should handle empty wallet arrays', async () => {
382
+ mockWrappedAPI = createMockParentAPI({
383
+ eip6963Wallets: [],
384
+ walletStandardWallets: [],
385
+ tronWallets: []
386
+ });
387
+ await createBridgeChildInIframe();
388
+ await vi.advanceTimersByTimeAsync(500);
389
+ expect(window.eip6963Wallets).toEqual([]);
390
+ expect(window.walletStandardWallets).toEqual([]);
391
+ expect(window.tronWallets).toEqual([]);
392
+ });
393
+ });
394
+ });
395
+ //# sourceMappingURL=BridgeChild.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BridgeChild.test.js","sourceRoot":"","sources":["../src/BridgeChild.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meshconnect/uwc-bridge-child",
3
- "version": "0.0.4",
3
+ "version": "0.1.1",
4
4
  "description": "Child iframe bridge for Universal Wallet Connector",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -0,0 +1,483 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'
2
+
3
+ // Create a mock parentAPI that simulates what Comlink.wrap returns
4
+ const createMockParentAPI = (
5
+ opts: {
6
+ eip6963Ready?: boolean
7
+ walletStandardReady?: boolean
8
+ tronReady?: boolean
9
+ eip6963Wallets?: any[]
10
+ walletStandardWallets?: any[]
11
+ tronWallets?: any[]
12
+ } = {}
13
+ ) => ({
14
+ eip6963WalletsReady: opts.eip6963Ready ?? true,
15
+ walletStandardWalletsReady: opts.walletStandardReady ?? true,
16
+ tronWalletsReady: opts.tronReady ?? true,
17
+ eip6963Wallets: opts.eip6963Wallets ?? [],
18
+ walletStandardWallets: opts.walletStandardWallets ?? [],
19
+ tronWallets: opts.tronWallets ?? [],
20
+ discoverTronWallets: vi.fn()
21
+ })
22
+
23
+ let mockWrappedAPI: ReturnType<typeof createMockParentAPI> | null = null
24
+
25
+ // Mock Comlink
26
+ vi.mock('comlink', () => ({
27
+ wrap: vi.fn(() => mockWrappedAPI),
28
+ windowEndpoint: vi.fn().mockReturnValue({})
29
+ }))
30
+
31
+ // Store original window properties
32
+ const originalParent = window.parent
33
+ const originalReferrer = Object.getOwnPropertyDescriptor(document, 'referrer')
34
+
35
+ describe('BridgeChild', () => {
36
+ beforeEach(() => {
37
+ vi.clearAllMocks()
38
+ vi.useFakeTimers()
39
+ vi.resetModules()
40
+
41
+ // Reset window globals
42
+ delete (window as any).UWCBridgeChildInitialized
43
+ delete (window as any).eip6963Wallets
44
+ delete (window as any).walletStandardWallets
45
+ delete (window as any).tronWallets
46
+
47
+ mockWrappedAPI = createMockParentAPI()
48
+
49
+ // Mock document.referrer
50
+ Object.defineProperty(document, 'referrer', {
51
+ value: 'https://parent.example.com/page',
52
+ writable: true,
53
+ configurable: true
54
+ })
55
+ })
56
+
57
+ afterEach(() => {
58
+ vi.useRealTimers()
59
+ vi.restoreAllMocks()
60
+
61
+ // Cleanup window globals
62
+ delete (window as any).UWCBridgeChildInitialized
63
+ delete (window as any).eip6963Wallets
64
+ delete (window as any).walletStandardWallets
65
+ delete (window as any).tronWallets
66
+
67
+ // Restore document.referrer
68
+ if (originalReferrer) {
69
+ Object.defineProperty(document, 'referrer', originalReferrer)
70
+ }
71
+ })
72
+
73
+ // Helper to create a BridgeChild by simulating iframe context
74
+ const createBridgeChildInIframe = async (options?: {
75
+ tronInjectedIds?: string[]
76
+ }) => {
77
+ // Mock window.parent to be different from window (iframe context)
78
+ Object.defineProperty(window, 'parent', {
79
+ value: { postMessage: vi.fn() },
80
+ writable: true,
81
+ configurable: true
82
+ })
83
+
84
+ const { BridgeChild } = await import('./BridgeChild')
85
+ const child = new BridgeChild(options)
86
+
87
+ // Restore parent after construction
88
+ Object.defineProperty(window, 'parent', {
89
+ value: originalParent,
90
+ writable: true,
91
+ configurable: true
92
+ })
93
+
94
+ return child
95
+ }
96
+
97
+ describe('constructor', () => {
98
+ it('should accept empty options', async () => {
99
+ const child = await createBridgeChildInIframe()
100
+ expect(child).toBeDefined()
101
+ })
102
+
103
+ it('should accept tronInjectedIds option', async () => {
104
+ const child = await createBridgeChildInIframe({
105
+ tronInjectedIds: ['tronLink']
106
+ })
107
+ expect(child).toBeDefined()
108
+ })
109
+ })
110
+
111
+ describe('initializeConnection', () => {
112
+ it('should not initialize when window.parent equals window (not in iframe)', async () => {
113
+ const Comlink = await import('comlink')
114
+
115
+ // window.parent === window means we're NOT in an iframe
116
+ Object.defineProperty(window, 'parent', {
117
+ value: window,
118
+ writable: true,
119
+ configurable: true
120
+ })
121
+
122
+ const { BridgeChild } = await import('./BridgeChild')
123
+ new BridgeChild()
124
+
125
+ await vi.advanceTimersByTimeAsync(200)
126
+
127
+ expect(Comlink.wrap).not.toHaveBeenCalled()
128
+ expect((window as any).UWCBridgeChildInitialized).toBeUndefined()
129
+
130
+ Object.defineProperty(window, 'parent', {
131
+ value: originalParent,
132
+ writable: true,
133
+ configurable: true
134
+ })
135
+ })
136
+
137
+ it('should set UWCBridgeChildInitialized when in iframe', async () => {
138
+ await createBridgeChildInIframe()
139
+
140
+ expect((window as any).UWCBridgeChildInitialized).toBe(true)
141
+ })
142
+
143
+ it('should call Comlink.wrap and windowEndpoint', async () => {
144
+ const Comlink = await import('comlink')
145
+
146
+ await createBridgeChildInIframe()
147
+
148
+ expect(Comlink.windowEndpoint).toHaveBeenCalled()
149
+ expect(Comlink.wrap).toHaveBeenCalled()
150
+ })
151
+ })
152
+
153
+ describe('wallet polling', () => {
154
+ it('should set EIP6963 wallets on window when parent is ready', async () => {
155
+ const mockEip6963 = [
156
+ {
157
+ uuid: 'wallet-1',
158
+ name: 'MetaMask',
159
+ icon: 'mm-icon',
160
+ rdns: 'io.metamask',
161
+ provider: { request: vi.fn() }
162
+ }
163
+ ]
164
+
165
+ mockWrappedAPI = createMockParentAPI({
166
+ eip6963Wallets: mockEip6963
167
+ })
168
+
169
+ await createBridgeChildInIframe()
170
+
171
+ // Allow poll cycle to complete
172
+ await vi.advanceTimersByTimeAsync(500)
173
+
174
+ expect((window as any).eip6963Wallets).toBeDefined()
175
+ expect((window as any).eip6963Wallets).toHaveLength(1)
176
+ expect((window as any).eip6963Wallets[0].uuid).toBe('wallet-1')
177
+ })
178
+
179
+ it('should set Wallet Standard wallets on window', async () => {
180
+ const mockSolana = [
181
+ {
182
+ uuid: 'phantom-solana',
183
+ name: 'Phantom',
184
+ chains: ['solana:mainnet'],
185
+ features: ['standard:connect'],
186
+ adapter: {}
187
+ }
188
+ ]
189
+
190
+ mockWrappedAPI = createMockParentAPI({
191
+ walletStandardWallets: mockSolana
192
+ })
193
+
194
+ await createBridgeChildInIframe()
195
+ await vi.advanceTimersByTimeAsync(500)
196
+
197
+ expect((window as any).walletStandardWallets).toBeDefined()
198
+ expect((window as any).walletStandardWallets).toHaveLength(1)
199
+ expect((window as any).walletStandardWallets[0].name).toBe('Phantom')
200
+ })
201
+
202
+ it('should set Tron wallets on window', async () => {
203
+ const mockTron = [
204
+ {
205
+ uuid: 'tron-tronlink',
206
+ name: 'tronLink',
207
+ injectedId: 'tronLink',
208
+ provider: { tronWeb: {} }
209
+ }
210
+ ]
211
+
212
+ mockWrappedAPI = createMockParentAPI({
213
+ tronWallets: mockTron
214
+ })
215
+
216
+ await createBridgeChildInIframe({ tronInjectedIds: ['tronLink'] })
217
+ await vi.advanceTimersByTimeAsync(500)
218
+
219
+ expect((window as any).tronWallets).toBeDefined()
220
+ expect((window as any).tronWallets).toHaveLength(1)
221
+ expect((window as any).tronWallets[0].uuid).toBe('tron-tronlink')
222
+ })
223
+
224
+ it('should call discoverTronWallets with provided injectedIds', async () => {
225
+ mockWrappedAPI = createMockParentAPI()
226
+
227
+ await createBridgeChildInIframe({
228
+ tronInjectedIds: ['tronLink', 'tokenpocket.tron']
229
+ })
230
+ await vi.advanceTimersByTimeAsync(500)
231
+
232
+ expect(mockWrappedAPI!.discoverTronWallets).toHaveBeenCalledWith([
233
+ 'tronLink',
234
+ 'tokenpocket.tron'
235
+ ])
236
+ })
237
+
238
+ it('should continue polling when wallets are not ready', async () => {
239
+ mockWrappedAPI = createMockParentAPI({
240
+ eip6963Ready: false,
241
+ walletStandardReady: false,
242
+ tronReady: false
243
+ })
244
+
245
+ await createBridgeChildInIframe()
246
+ await vi.advanceTimersByTimeAsync(500)
247
+
248
+ // Window globals should NOT be set when not ready
249
+ expect((window as any).eip6963Wallets).toBeUndefined()
250
+ })
251
+
252
+ it('should stop polling when wallets are already set on window', async () => {
253
+ // Pre-set wallets on window
254
+ ;(window as any).eip6963Wallets = [{ uuid: 'existing' }]
255
+
256
+ mockWrappedAPI = createMockParentAPI()
257
+
258
+ await createBridgeChildInIframe()
259
+ await vi.advanceTimersByTimeAsync(500)
260
+
261
+ // discoverTronWallets should not be called since polling stopped early
262
+ expect(mockWrappedAPI!.discoverTronWallets).not.toHaveBeenCalled()
263
+ })
264
+
265
+ it('should handle errors gracefully and continue polling', async () => {
266
+ // First call throws, subsequent calls succeed
267
+ let callCount = 0
268
+ const failingAPI = {
269
+ get eip6963WalletsReady() {
270
+ callCount++
271
+ if (callCount <= 1) {
272
+ throw new Error('API not ready')
273
+ }
274
+ return true
275
+ },
276
+ walletStandardWalletsReady: true,
277
+ tronWalletsReady: true,
278
+ eip6963Wallets: [],
279
+ walletStandardWallets: [],
280
+ tronWallets: [],
281
+ discoverTronWallets: vi.fn()
282
+ }
283
+
284
+ mockWrappedAPI = failingAPI as any
285
+
286
+ await createBridgeChildInIframe()
287
+ await vi.advanceTimersByTimeAsync(1000)
288
+
289
+ // Should eventually succeed and set wallets
290
+ expect((window as any).eip6963Wallets).toBeDefined()
291
+ })
292
+ })
293
+
294
+ describe('backward compatibility with older BridgeParent (no Tron)', () => {
295
+ it('should still set EVM and Solana wallets when parent has no Tron support', async () => {
296
+ const eip6963Wallets = [
297
+ {
298
+ uuid: 'mm-1',
299
+ name: 'MetaMask',
300
+ icon: 'mm-icon',
301
+ rdns: 'io.metamask',
302
+ provider: { request: vi.fn() }
303
+ }
304
+ ]
305
+ const walletStandardWallets = [
306
+ {
307
+ uuid: 'phantom-1',
308
+ name: 'Phantom',
309
+ chains: ['solana:mainnet'],
310
+ features: ['standard:connect'],
311
+ adapter: {}
312
+ }
313
+ ]
314
+
315
+ // Simulate old parent that throws on any Tron property access
316
+ const oldParentAPI = {
317
+ eip6963WalletsReady: true,
318
+ walletStandardWalletsReady: true,
319
+ eip6963Wallets,
320
+ walletStandardWallets,
321
+ get tronWalletsReady(): boolean {
322
+ throw new Error('tronWalletsReady is not defined')
323
+ },
324
+ get tronWallets(): unknown[] {
325
+ throw new Error('tronWallets is not defined')
326
+ },
327
+ get discoverTronWallets() {
328
+ return undefined
329
+ }
330
+ }
331
+
332
+ mockWrappedAPI = oldParentAPI as any
333
+
334
+ await createBridgeChildInIframe({ tronInjectedIds: ['tronLink'] })
335
+ await vi.advanceTimersByTimeAsync(500)
336
+
337
+ // EVM and Solana should still be set
338
+ expect((window as any).eip6963Wallets).toHaveLength(1)
339
+ expect((window as any).eip6963Wallets[0].uuid).toBe('mm-1')
340
+ expect((window as any).walletStandardWallets).toHaveLength(1)
341
+ expect((window as any).walletStandardWallets[0].name).toBe('Phantom')
342
+ // Tron should fall back to empty array
343
+ expect((window as any).tronWallets).toEqual([])
344
+ })
345
+
346
+ it('should set tron to empty array when discoverTronWallets throws', async () => {
347
+ const apiWithBrokenDiscover = {
348
+ eip6963WalletsReady: true,
349
+ walletStandardWalletsReady: true,
350
+ eip6963Wallets: [],
351
+ walletStandardWallets: [],
352
+ tronWalletsReady: true,
353
+ tronWallets: [],
354
+ discoverTronWallets: vi.fn(() => {
355
+ throw new Error('Method not supported')
356
+ })
357
+ }
358
+
359
+ mockWrappedAPI = apiWithBrokenDiscover as any
360
+
361
+ await createBridgeChildInIframe({ tronInjectedIds: ['tronLink'] })
362
+ await vi.advanceTimersByTimeAsync(500)
363
+
364
+ expect((window as any).eip6963Wallets).toEqual([])
365
+ expect((window as any).walletStandardWallets).toEqual([])
366
+ expect((window as any).tronWallets).toEqual([])
367
+ })
368
+
369
+ it('should not block on tron when tronWalletsReady is false', async () => {
370
+ const eip6963Wallets = [
371
+ {
372
+ uuid: 'mm-1',
373
+ name: 'MetaMask',
374
+ icon: 'mm-icon',
375
+ rdns: 'io.metamask',
376
+ provider: { request: vi.fn() }
377
+ }
378
+ ]
379
+
380
+ mockWrappedAPI = createMockParentAPI({
381
+ eip6963Wallets,
382
+ tronReady: false,
383
+ tronWallets: []
384
+ })
385
+
386
+ await createBridgeChildInIframe()
387
+ await vi.advanceTimersByTimeAsync(500)
388
+
389
+ // EVM and Solana should be set even though tron is not ready
390
+ expect((window as any).eip6963Wallets).toHaveLength(1)
391
+ expect((window as any).walletStandardWallets).toEqual([])
392
+ // Tron should be empty (not ready, so inner block skipped)
393
+ expect((window as any).tronWallets).toEqual([])
394
+ })
395
+
396
+ it('should only call discoverTronWallets once across multiple polls', async () => {
397
+ // First poll: eip6963 not ready, so returns 'continue'
398
+ // Second poll: eip6963 ready, completes
399
+ let callCount = 0
400
+ const progressiveAPI = {
401
+ get eip6963WalletsReady() {
402
+ callCount++
403
+ return callCount > 1
404
+ },
405
+ walletStandardWalletsReady: true,
406
+ tronWalletsReady: true,
407
+ eip6963Wallets: [],
408
+ walletStandardWallets: [],
409
+ tronWallets: [],
410
+ discoverTronWallets: vi.fn()
411
+ }
412
+
413
+ mockWrappedAPI = progressiveAPI as any
414
+
415
+ await createBridgeChildInIframe({
416
+ tronInjectedIds: ['tronLink']
417
+ })
418
+ await vi.advanceTimersByTimeAsync(1000)
419
+
420
+ // discoverTronWallets should only be called once due to tronDiscoveryTriggered flag
421
+ expect(progressiveAPI.discoverTronWallets).toHaveBeenCalledTimes(1)
422
+ })
423
+ })
424
+
425
+ describe('checkWallets with all wallet types', () => {
426
+ it('should fetch all wallet types and set on window', async () => {
427
+ const eip6963Wallets = [
428
+ {
429
+ uuid: 'mm-1',
430
+ name: 'MetaMask',
431
+ icon: 'mm-icon',
432
+ rdns: 'io.metamask',
433
+ provider: { request: vi.fn() }
434
+ }
435
+ ]
436
+ const walletStandardWallets = [
437
+ {
438
+ uuid: 'phantom-1',
439
+ name: 'Phantom',
440
+ chains: ['solana:mainnet'],
441
+ features: ['standard:connect'],
442
+ adapter: { connect: vi.fn() }
443
+ }
444
+ ]
445
+ const tronWallets = [
446
+ {
447
+ uuid: 'tron-tronlink',
448
+ name: 'tronLink',
449
+ injectedId: 'tronLink',
450
+ provider: { tronWeb: {} }
451
+ }
452
+ ]
453
+
454
+ mockWrappedAPI = createMockParentAPI({
455
+ eip6963Wallets,
456
+ walletStandardWallets,
457
+ tronWallets
458
+ })
459
+
460
+ await createBridgeChildInIframe({ tronInjectedIds: ['tronLink'] })
461
+ await vi.advanceTimersByTimeAsync(500)
462
+
463
+ expect((window as any).eip6963Wallets).toHaveLength(1)
464
+ expect((window as any).walletStandardWallets).toHaveLength(1)
465
+ expect((window as any).tronWallets).toHaveLength(1)
466
+ })
467
+
468
+ it('should handle empty wallet arrays', async () => {
469
+ mockWrappedAPI = createMockParentAPI({
470
+ eip6963Wallets: [],
471
+ walletStandardWallets: [],
472
+ tronWallets: []
473
+ })
474
+
475
+ await createBridgeChildInIframe()
476
+ await vi.advanceTimersByTimeAsync(500)
477
+
478
+ expect((window as any).eip6963Wallets).toEqual([])
479
+ expect((window as any).walletStandardWallets).toEqual([])
480
+ expect((window as any).tronWallets).toEqual([])
481
+ })
482
+ })
483
+ })
@@ -9,12 +9,18 @@ interface ParentAPI {
9
9
  eip6963WalletsReady: boolean
10
10
  walletStandardWallets: unknown[]
11
11
  walletStandardWalletsReady: boolean
12
+ tronWallets: unknown[]
13
+ tronWalletsReady: boolean
14
+ discoverTronWallets: (injectedIds: string[]) => void
12
15
  }
13
16
 
14
17
  export class BridgeChild {
15
18
  private parentAPI?: Comlink.Remote<ParentAPI>
19
+ private tronInjectedIds: string[]
20
+ private tronDiscoveryTriggered = false
16
21
 
17
- constructor() {
22
+ constructor(options?: { tronInjectedIds?: string[] }) {
23
+ this.tronInjectedIds = options?.tronInjectedIds ?? []
18
24
  this.initializeConnection()
19
25
  }
20
26
 
@@ -25,7 +31,11 @@ export class BridgeChild {
25
31
  window.UWCBridgeChildInitialized = true
26
32
 
27
33
  this.parentAPI = Comlink.wrap<ParentAPI>(
28
- Comlink.windowEndpoint(window.parent, self, '*')
34
+ Comlink.windowEndpoint(
35
+ window.parent,
36
+ self,
37
+ new URL(document.referrer).origin
38
+ )
29
39
  )
30
40
 
31
41
  this.pollForWallets()
@@ -46,7 +56,8 @@ export class BridgeChild {
46
56
  if (
47
57
  (window.eip6963Wallets && window.eip6963Wallets.length > 0) ||
48
58
  (window.walletStandardWallets &&
49
- window.walletStandardWallets.length > 0)
59
+ window.walletStandardWallets.length > 0) ||
60
+ (window.tronWallets && window.tronWallets.length > 0)
50
61
  ) {
51
62
  return
52
63
  }
@@ -58,7 +69,7 @@ export class BridgeChild {
58
69
 
59
70
  // Create a timeout promise to prevent hanging
60
71
  const timeoutPromise = new Promise((_, reject) => {
61
- setTimeout(() => reject(new Error('Timeout accessing parent API')), 200)
72
+ setTimeout(() => reject(new Error('Timeout accessing parent API')), 100)
62
73
  })
63
74
 
64
75
  // Try to check wallets with a timeout
@@ -82,7 +93,7 @@ export class BridgeChild {
82
93
 
83
94
  private async checkWallets(): Promise<string> {
84
95
  try {
85
- // Check if both EIP6963 and Wallet Standard wallets are ready
96
+ // Check if EIP6963 and Wallet Standard wallets are ready
86
97
  const eip6963Ready = await this.parentAPI?.eip6963WalletsReady
87
98
  const walletStandardReady =
88
99
  await this.parentAPI?.walletStandardWalletsReady
@@ -128,21 +139,44 @@ export class BridgeChild {
128
139
  }
129
140
  }
130
141
 
131
- // Set both wallet types on window
142
+ // Get Tron wallets - wrapped in try/catch for backward compatibility
143
+ // with older BridgeParent versions that don't have Tron support
144
+ let tronWallets: unknown[] = []
145
+ try {
146
+ if (!this.tronDiscoveryTriggered) {
147
+ await this.parentAPI?.discoverTronWallets?.(this.tronInjectedIds)
148
+ this.tronDiscoveryTriggered = true
149
+ }
150
+
151
+ const tronReady = await this.parentAPI?.tronWalletsReady
152
+ if (tronReady) {
153
+ const availableTronWallets = await this.parentAPI.tronWallets.length
154
+
155
+ if (availableTronWallets > 0) {
156
+ for (let index = 0; index < availableTronWallets; index++) {
157
+ const wallet = {
158
+ uuid: await this.parentAPI.tronWallets[index].uuid,
159
+ name: await this.parentAPI.tronWallets[index].name,
160
+ injectedId: await this.parentAPI.tronWallets[index].injectedId,
161
+ provider: this.parentAPI.tronWallets[index].provider
162
+ }
163
+ tronWallets.push(wallet)
164
+ }
165
+ }
166
+ }
167
+ } catch {
168
+ // Parent doesn't support Tron - use empty array
169
+ tronWallets = []
170
+ }
171
+
172
+ // Set all wallet types on window
132
173
  window.eip6963Wallets = eip6963Wallets
133
174
  window.walletStandardWallets = walletStandardWallets
175
+ window.tronWallets = tronWallets
134
176
 
135
177
  return 'stop'
136
178
  } catch {
137
179
  return 'continue'
138
180
  }
139
181
  }
140
-
141
- getParentAPI(): Comlink.Remote<ParentAPI> | undefined {
142
- return this.parentAPI
143
- }
144
-
145
- isConnected(): boolean {
146
- return this.parentAPI !== undefined
147
- }
148
182
  }