@meshconnect/uwc-core 1.1.1-snapshot.a261258 → 1.1.2

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 +1 @@
1
- {"version":3,"file":"connection-service.d.ts","sourceRoot":"","sources":["../../src/services/connection-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EAET,cAAc,EACd,cAAc,EACd,SAAS,EAMV,MAAM,wBAAwB,CAAA;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAK7D,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,qBAAa,iBAAiB;IAc1B,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,YAAY;IAEpB,OAAO,CAAC,uBAAuB;IApBjC,OAAO,CAAC,eAAe,CAAyB;IAChD,+EAA+E;IAC/E,OAAO,CAAC,iBAAiB,CAA0B;IACnD;;;;;;OAMG;IACH,OAAO,CAAC,aAAa,CAA+B;gBAG1C,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,cAAc,EAAE,EACzB,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,GAAG,CAAC,cAAc,EAAE,SAAS,CAAC,EAC1C,sBAAsB,EAAE,OAAO,EAC/B,YAAY,EAAE,YAAY,EAE1B,uBAAuB,EAAE,MAAM;IAGnC,OAAO,CACX,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,SAAS,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC;IAkJhB,qFAAqF;IACrF,OAAO,CAAC,eAAe;IA8CvB;;;;;;OAMG;IACH,iBAAiB,IAAI,IAAI;IAKzB;;;;;;;OAOG;IACH,iBAAiB,IAAI,IAAI;YAqBX,kBAAkB;IAgEhC,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,kBAAkB;IA2C1B,OAAO,CAAC,2BAA2B;IAiD7B,UAAU,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBzD,gBAAgB,IAAI,MAAM,GAAG,SAAS;IAiBtC,UAAU,IAAI,cAAc,EAAE;IAI9B,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI;IAI9C,WAAW,IAAI,OAAO,EAAE;IAIxB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,wBAAwB;CAiBjC"}
1
+ {"version":3,"file":"connection-service.d.ts","sourceRoot":"","sources":["../../src/services/connection-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EAET,cAAc,EACd,cAAc,EACd,SAAS,EAMV,MAAM,wBAAwB,CAAA;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAK7D,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,qBAAa,iBAAiB;IAc1B,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,YAAY;IAEpB,OAAO,CAAC,uBAAuB;IApBjC,OAAO,CAAC,eAAe,CAAyB;IAChD,+EAA+E;IAC/E,OAAO,CAAC,iBAAiB,CAA0B;IACnD;;;;;;OAMG;IACH,OAAO,CAAC,aAAa,CAA+B;gBAG1C,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,cAAc,EAAE,EACzB,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,GAAG,CAAC,cAAc,EAAE,SAAS,CAAC,EAC1C,sBAAsB,EAAE,OAAO,EAC/B,YAAY,EAAE,YAAY,EAE1B,uBAAuB,EAAE,MAAM;IAGnC,OAAO,CACX,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,SAAS,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC;IAuJhB,qFAAqF;IACrF,OAAO,CAAC,eAAe;IA8CvB;;;;;;OAMG;IACH,iBAAiB,IAAI,IAAI;IAKzB;;;;;;;OAOG;IACH,iBAAiB,IAAI,IAAI;YAqBX,kBAAkB;IAgEhC,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,kBAAkB;IA2C1B,OAAO,CAAC,2BAA2B;IAiD7B,UAAU,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BzD,gBAAgB,IAAI,MAAM,GAAG,SAAS;IAiBtC,UAAU,IAAI,cAAc,EAAE;IAI9B,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI;IAI9C,WAAW,IAAI,OAAO,EAAE;IAIxB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,wBAAwB;CAiBjC"}
@@ -34,6 +34,14 @@ export class ConnectionService {
34
34
  }
35
35
  async connect(connectionMode, walletId, networkId, options) {
36
36
  options?.signal?.throwIfAborted();
37
+ // Validate BEFORE touching any in-flight state. A lookup/validation failure
38
+ // (unknown walletId, unsupported mode, bad network) must not abort a valid
39
+ // prior in-flight attempt, nor leave a dangling `inFlightAbort` that a later
40
+ // connect() would spuriously abort (MFS-602).
41
+ const wallet = this.findWallet(walletId);
42
+ const provider = this.getProviderForMode(wallet, connectionMode);
43
+ const network = this.validateAndDetermineNetwork(networkId, provider);
44
+ const connector = this.getConnector(connectionMode);
37
45
  // Supersede any prior in-flight attempt: abort it so its URI poll and
38
46
  // handoff visibility listeners tear down (via the abort paths below) BEFORE
39
47
  // this attempt starts, instead of running alongside it (MFS-602). The
@@ -43,23 +51,18 @@ export class ConnectionService {
43
51
  const attemptAbort = new AbortController();
44
52
  this.inFlightAbort = attemptAbort;
45
53
  const callerSignal = options?.signal;
54
+ let removeCallerAbortListener;
46
55
  if (callerSignal) {
47
56
  if (callerSignal.aborted) {
48
57
  attemptAbort.abort(callerSignal.reason);
49
58
  }
50
59
  else {
51
- callerSignal.addEventListener('abort', () => attemptAbort.abort(callerSignal.reason), { once: true });
60
+ const onCallerAbort = () => attemptAbort.abort(callerSignal.reason);
61
+ callerSignal.addEventListener('abort', onCallerAbort, { once: true });
62
+ removeCallerAbortListener = () => callerSignal.removeEventListener('abort', onCallerAbort);
52
63
  }
53
64
  }
54
65
  const signal = attemptAbort.signal;
55
- // Find the wallet
56
- const wallet = this.findWallet(walletId);
57
- // Get the appropriate provider based on connection mode
58
- const provider = this.getProviderForMode(wallet, connectionMode);
59
- // Validate and determine the network
60
- const network = this.validateAndDetermineNetwork(networkId, provider);
61
- // Get the appropriate connector
62
- const connector = this.getConnector(connectionMode);
63
66
  // Emit AFTER validation so a thrown lookup/validation error doesn't leave
64
67
  // listeners seeing a "connecting" state for an attempt that never started.
65
68
  this.eventManager.emit('connecting', { connectionMode, walletId });
@@ -105,20 +108,26 @@ export class ConnectionService {
105
108
  signal.throwIfAborted();
106
109
  }
107
110
  catch (error) {
108
- // Only release if WE are still the active attempt. A newer connect() that
109
- // superseded us has already installed its own connector and in-flight
110
- // token; nulling here would wrongly detach the live attempt (MFS-602).
111
- if (this.activeConnector === connector)
111
+ // Only release if WE are still the in-flight attempt. Gate BOTH releases
112
+ // on the identity-unique `attemptAbort` token, never on
113
+ // `this.activeConnector === connector`: `connectors` is a shared singleton
114
+ // Map, so a same-mode re-entrant connect() reuses the IDENTICAL connector
115
+ // object — a reference check would pass here and wrongly detach the newer,
116
+ // now-live attempt's connector, breaking its URI polling and leaving a
117
+ // later disconnect() unable to tear down the real wallet session (MFS-602).
118
+ if (this.inFlightAbort === attemptAbort) {
112
119
  this.activeConnector = null;
113
- if (this.inFlightAbort === attemptAbort)
114
120
  this.inFlightAbort = null;
121
+ }
122
+ removeCallerAbortListener?.();
115
123
  throw error;
116
124
  }
117
125
  // This attempt reached a successful handoff without being superseded (a
118
126
  // supersession aborts `signal`, which the belt-and-suspenders check above
119
- // turns into a throw). Release the in-flight handle.
127
+ // turns into a throw). Release the in-flight handle + caller-signal listener.
120
128
  if (this.inFlightAbort === attemptAbort)
121
129
  this.inFlightAbort = null;
130
+ removeCallerAbortListener?.();
122
131
  // Filter available addresses to only include those for configured networks
123
132
  const filteredAvailableAddresses = result.availableAddresses.filter(addr => this.networks.some(n => n.id === addr.networkId));
124
133
  this.sessionManager.updateSession({
@@ -338,6 +347,13 @@ export class ConnectionService {
338
347
  }
339
348
  async disconnect(options) {
340
349
  options?.signal?.throwIfAborted();
350
+ // Cancel any in-flight connect() first. Without this, a wallet that responds
351
+ // AFTER the user disconnects would let the pending connect() proceed past its
352
+ // `signal.throwIfAborted()` guard into updateSession()/`connected`, resurrecting
353
+ // the session just torn down. Aborting the shared in-flight token makes that
354
+ // attempt bail via raceAbort (its late result is discarded). No-op on the
355
+ // normal path: a settled connect() already nulled `inFlightAbort` (MFS-602).
356
+ this.inFlightAbort?.abort(new DOMException('Connection cancelled by disconnect', 'AbortError'));
341
357
  // Remove the lifecycle listeners first so a provider 'disconnect' fired during
342
358
  // teardown doesn't re-enter as a wallet-initiated `walletDisconnected`.
343
359
  this.teardownLifecycle();
@@ -1 +1 @@
1
- {"version":3,"file":"connection-service.js","sourceRoot":"","sources":["../../src/services/connection-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connection-service.js","sourceRoot":"","sources":["../../src/services/connection-service.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const UWC_CORE_VERSION = "1.1.1";
1
+ export declare const UWC_CORE_VERSION = "1.1.2";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  // Generated from package.json by scripts/generate-version.mjs — do not edit.
2
- export const UWC_CORE_VERSION = '1.1.1';
2
+ export const UWC_CORE_VERSION = '1.1.2';
3
3
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meshconnect/uwc-core",
3
- "version": "1.1.1-snapshot.a261258",
3
+ "version": "1.1.2",
4
4
  "description": "Core functionality for Universal Wallet Connector",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -16,10 +16,10 @@
16
16
  "src"
17
17
  ],
18
18
  "dependencies": {
19
- "@meshconnect/uwc-injected-connector": "0.16.1-snapshot.a261258",
20
- "@meshconnect/uwc-ton-connector": "0.7.1-snapshot.a261258",
21
- "@meshconnect/uwc-types": "0.18.0-snapshot.a261258",
22
- "@meshconnect/uwc-wallet-connect-connector": "0.7.1-snapshot.a261258"
19
+ "@meshconnect/uwc-injected-connector": "0.16.1",
20
+ "@meshconnect/uwc-ton-connector": "0.7.1",
21
+ "@meshconnect/uwc-types": "0.18.0",
22
+ "@meshconnect/uwc-wallet-connect-connector": "0.7.1"
23
23
  },
24
24
  "devDependencies": {
25
25
  "typescript": "^5.9.3"
@@ -6,7 +6,8 @@ import type {
6
6
  Network,
7
7
  WalletMetadata,
8
8
  ConnectionMode,
9
- Connector
9
+ Connector,
10
+ ConnectorResult
10
11
  } from '@meshconnect/uwc-types'
11
12
 
12
13
  // MFS-602: connect() must be re-entrancy safe.
@@ -78,20 +79,35 @@ describe('MFS-602: ConnectionService.connect() re-entrancy safety', () => {
78
79
  connectors.set('walletConnect', wcConnector)
79
80
  connectors.set('tonConnect', tonConnector)
80
81
 
81
- // No wallet-response timeout (arg omitted) so the only timers in play are
82
- // the poll interval + its watchdogkeeps getTimerCount() unambiguous.
82
+ // Explicit `0` wallet-response timeout: `instrumentHandoff` only arms the
83
+ // marker when `timeoutMs > 0`, so 0 disables it leaving the poll interval
84
+ // + its watchdog as the only timers, which keeps getTimerCount() unambiguous.
83
85
  connectionService = new ConnectionService(
84
86
  [network],
85
87
  wallets,
86
88
  sessionManager,
87
89
  connectors,
88
90
  false,
89
- eventManager
91
+ eventManager,
92
+ 0
90
93
  )
91
94
  })
92
95
 
93
- afterEach(() => {
96
+ afterEach(async () => {
97
+ // Drop fake timers first so any still-armed poll interval/watchdog from a
98
+ // never-settling connect() is discarded rather than leaked into later tests.
94
99
  vi.useRealTimers()
100
+ // A pending connect() also keeps its handoff focus/visibility listeners
101
+ // attached (instrumentHandoff only detaches them in its finally, which never
102
+ // runs while the wallet op hangs). disconnect() aborts the in-flight attempt,
103
+ // so that finally runs and stopFocus() releases them.
104
+ await connectionService.disconnect().catch(() => {})
105
+ await Promise.resolve()
106
+ // Restore the visibility override the fan-out test installs.
107
+ Object.defineProperty(document, 'visibilityState', {
108
+ value: 'visible',
109
+ configurable: true
110
+ })
95
111
  })
96
112
 
97
113
  it('supersedes a prior pending attempt: only one poll stays live (timers bounded)', async () => {
@@ -165,6 +181,237 @@ describe('MFS-602: ConnectionService.connect() re-entrancy safety', () => {
165
181
  ).toBe(true)
166
182
  })
167
183
 
184
+ it('a re-entrant connect that fails validation does not abort a valid prior attempt', async () => {
185
+ vi.useFakeTimers()
186
+
187
+ // A valid attempt is in flight (poll armed).
188
+ let priorSettled = false
189
+ connectionService.connect('walletConnect', 'tonkeeper').then(
190
+ () => {
191
+ priorSettled = true
192
+ },
193
+ () => {
194
+ priorSettled = true
195
+ }
196
+ )
197
+ await vi.advanceTimersByTimeAsync(150)
198
+ const timersBefore = vi.getTimerCount()
199
+
200
+ // Re-enter with an unknown walletId: validation throws (findWallet) BEFORE
201
+ // any supersede/abort. The prior attempt must be left untouched — not
202
+ // aborted, not left with a dangling inFlightAbort.
203
+ await expect(
204
+ connectionService.connect('walletConnect', 'does-not-exist')
205
+ ).rejects.toThrow(/not found/)
206
+ await vi.advanceTimersByTimeAsync(10)
207
+
208
+ // Prior valid attempt is still pending and its poll still live.
209
+ expect(priorSettled).toBe(false)
210
+ expect(vi.getTimerCount()).toBe(timersBefore)
211
+ })
212
+
213
+ // SAME-MODE supersession is the gap the cross-mode tests above miss. Because
214
+ // `connectors` is a shared singleton Map, a re-entrant connect() on the SAME
215
+ // mode reuses the IDENTICAL connector object. The superseded attempt's catch
216
+ // block must NOT release the shared `activeConnector` — the reference check
217
+ // that guarded the cross-mode path (`activeConnector === connector`) passes
218
+ // here and would detach the newer, now-live attempt's connector. Both invariants
219
+ // below FAIL on the pre-fix `if (this.activeConnector === connector)` guard.
220
+ it('same-mode supersede: live attempt keeps activeConnector (getConnectionURI still resolves)', async () => {
221
+ vi.useFakeTimers()
222
+
223
+ // First walletConnect attempt, pending, then superseded by a SECOND
224
+ // walletConnect attempt — both hold the identical wcConnector object.
225
+ connectionService.connect('walletConnect', 'tonkeeper').catch(() => {})
226
+ await vi.advanceTimersByTimeAsync(150)
227
+
228
+ connectionService.connect('walletConnect', 'tonkeeper').catch(() => {})
229
+ // Flush the superseded attempt's abort rejection so its catch block runs.
230
+ await vi.advanceTimersByTimeAsync(150)
231
+
232
+ // The live attempt's connector must still be installed. Pre-fix, the
233
+ // superseded attempt nulled it (shared object), so this returns undefined.
234
+ expect(connectionService.getConnectionURI()).toBe('wc://uri')
235
+ })
236
+
237
+ it('same-mode supersede: disconnect() still tears down the real wallet session', async () => {
238
+ vi.useFakeTimers()
239
+
240
+ connectionService.connect('walletConnect', 'tonkeeper').catch(() => {})
241
+ await vi.advanceTimersByTimeAsync(150)
242
+
243
+ connectionService.connect('walletConnect', 'tonkeeper').catch(() => {})
244
+ await vi.advanceTimersByTimeAsync(150)
245
+
246
+ // Pre-fix: activeConnector was nulled out from under the live attempt, so
247
+ // disconnect() skips connector.disconnect() and orphans the wallet session.
248
+ await connectionService.disconnect()
249
+ expect(wcConnector.disconnect).toHaveBeenCalledTimes(1)
250
+ })
251
+
252
+ // MFS-602 #2: disconnect() must cancel an in-flight connect(). Otherwise a
253
+ // wallet that responds AFTER the user disconnects drives the pending connect()
254
+ // past its abort guard into updateSession()/`connected`, resurrecting the
255
+ // session just torn down. This FAILS pre-fix (disconnect never aborted the
256
+ // in-flight token, so `connected` fires and the caller's connect resolves).
257
+ it('disconnect() cancels an in-flight connect so a late wallet response cannot resurrect the session', async () => {
258
+ vi.useFakeTimers()
259
+
260
+ // A connect whose wallet response we control, so we can deliver it AFTER
261
+ // the disconnect — the exact ordering that resurrects a session.
262
+ let resolveConnect: (r: {
263
+ address: string
264
+ availableAddresses: []
265
+ }) => void = () => {}
266
+ wcConnector.connect = vi.fn().mockReturnValue(
267
+ new Promise<{ address: string; availableAddresses: [] }>(r => {
268
+ resolveConnect = r
269
+ })
270
+ )
271
+
272
+ const connectedEvents: unknown[] = []
273
+ eventManager.on('connected', e => connectedEvents.push(e))
274
+
275
+ let connectRejected = false
276
+ connectionService.connect('walletConnect', 'tonkeeper').then(
277
+ () => {},
278
+ () => {
279
+ connectRejected = true
280
+ }
281
+ )
282
+ await vi.advanceTimersByTimeAsync(150)
283
+
284
+ // User disconnects while the wallet prompt is still open.
285
+ await connectionService.disconnect()
286
+
287
+ // Wallet finally responds AFTER the disconnect — must be a no-op.
288
+ resolveConnect({ address: '0xabc', availableAddresses: [] })
289
+ await vi.advanceTimersByTimeAsync(10)
290
+
291
+ expect(connectRejected).toBe(true)
292
+ expect(connectedEvents).toHaveLength(0)
293
+ expect(sessionManager.getSession().connectionMode).toBeFalsy()
294
+ })
295
+
296
+ // Interaction between the two fixes: disconnect() aborts the in-flight attempt,
297
+ // which schedules that attempt's catch block (it nulls activeConnector) as a
298
+ // microtask. disconnect() must still read activeConnector and call the real
299
+ // connector.disconnect() SYNCHRONOUSLY — before that microtask runs — so the
300
+ // wallet session is actually torn down and not silently orphaned. Guards the
301
+ // ordering that would otherwise be a silent teardown regression.
302
+ it('disconnect() still tears down the real connector even while cancelling an in-flight connect', async () => {
303
+ vi.useFakeTimers()
304
+
305
+ connectionService.connect('walletConnect', 'tonkeeper').catch(() => {})
306
+ await vi.advanceTimersByTimeAsync(150)
307
+
308
+ await connectionService.disconnect()
309
+
310
+ // Synchronously within disconnect(), BEFORE the cancelled connect's catch
311
+ // microtask runs: the live wallet session was actually closed and the
312
+ // session connector released. This is the teardown-not-orphaned invariant.
313
+ expect(wcConnector.disconnect).toHaveBeenCalledTimes(1)
314
+ expect(connectionService['activeConnector']).toBeNull()
315
+
316
+ // Let the cancelled connect's rejection propagate; its catch then clears the
317
+ // (already-aborted) in-flight token, so no controller is leaked afterwards.
318
+ await vi.advanceTimersByTimeAsync(10)
319
+ expect(connectionService['inFlightAbort']).toBeNull()
320
+ })
321
+
322
+ // The strongest same-mode case: the re-entrant attempt actually SUCCEEDS.
323
+ // Pre-fix, the superseded attempt's catch (shared connector ref === match)
324
+ // nulls activeConnector WHILE the winning attempt is still awaiting its
325
+ // wallet, so the subsequent updateSession()/attachLifecycle wire a broken
326
+ // session (null connector → no URI, no lifecycle, dead disconnect). Post-fix
327
+ // the identity gate leaves the winner's connector intact.
328
+ it('same-mode supersede where the winning attempt connects: session wires cleanly', async () => {
329
+ vi.useFakeTimers()
330
+
331
+ // First WC attempt hangs; the second (superseding) WC attempt resolves.
332
+ let resolveWinner: (r: ConnectorResult) => void = () => {}
333
+ wcConnector.connect = vi
334
+ .fn()
335
+ .mockReturnValueOnce(new Promise(() => {}))
336
+ .mockReturnValueOnce(
337
+ new Promise<ConnectorResult>(r => {
338
+ resolveWinner = r
339
+ })
340
+ )
341
+
342
+ const connected: Array<{ session: unknown }> = []
343
+ eventManager.on('connected', e => connected.push(e as { session: unknown }))
344
+
345
+ connectionService.connect('walletConnect', 'tonkeeper').catch(() => {})
346
+ await vi.advanceTimersByTimeAsync(150)
347
+
348
+ connectionService.connect('walletConnect', 'tonkeeper').catch(() => {})
349
+ // Let the superseded attempt's catch run before the winner resolves.
350
+ await vi.advanceTimersByTimeAsync(150)
351
+
352
+ resolveWinner({
353
+ networkId: 'tvm:-239',
354
+ address: 'EQwinner',
355
+ availableAddresses: [{ address: 'EQwinner', networkId: 'tvm:-239' }]
356
+ } as ConnectorResult)
357
+ await vi.advanceTimersByTimeAsync(10)
358
+
359
+ // The winner owns the session, its connector is still installed, and it
360
+ // connected exactly once (no duplicate/leaked emission from the loser).
361
+ expect(connected).toHaveLength(1)
362
+ expect(sessionManager.getSession().connectionMode).toBe('walletConnect')
363
+ expect(sessionManager.getSession().activeAddress).toBe('EQwinner')
364
+ expect(connectionService['activeConnector']).toBe(wcConnector)
365
+ })
366
+
367
+ // Depth: three same-mode attempts, each superseding the last. Only the final
368
+ // attempt may stay live — no earlier catch may detach the survivor's shared
369
+ // connector. Pre-fix the middle attempt's catch nulls it.
370
+ it('deep same-mode supersede chain leaves only the last attempt live', async () => {
371
+ vi.useFakeTimers()
372
+
373
+ connectionService.connect('walletConnect', 'tonkeeper').catch(() => {})
374
+ await vi.advanceTimersByTimeAsync(60)
375
+ connectionService.connect('walletConnect', 'tonkeeper').catch(() => {})
376
+ await vi.advanceTimersByTimeAsync(60)
377
+ connectionService.connect('walletConnect', 'tonkeeper').catch(() => {})
378
+ await vi.advanceTimersByTimeAsync(150)
379
+
380
+ // Survivor's connector still installed → URI still resolvable, and exactly
381
+ // one poll remains armed (interval + watchdog).
382
+ expect(connectionService.getConnectionURI()).toBe('wc://uri')
383
+ })
384
+
385
+ // Cross-mode regression guard: a superseded attempt's LATE catch must never
386
+ // detach a DIFFERENT attempt that has since connected successfully.
387
+ it('a superseded attempt cannot detach a newer attempt that already connected (cross-mode)', async () => {
388
+ vi.useFakeTimers()
389
+
390
+ // WC attempt hangs; the superseding TON attempt resolves.
391
+ let resolveTon: (r: ConnectorResult) => void = () => {}
392
+ tonConnector.connect = vi.fn().mockReturnValue(
393
+ new Promise<ConnectorResult>(r => {
394
+ resolveTon = r
395
+ })
396
+ )
397
+
398
+ connectionService.connect('walletConnect', 'tonkeeper').catch(() => {})
399
+ await vi.advanceTimersByTimeAsync(150)
400
+
401
+ connectionService.connect('tonConnect', 'tonkeeper').catch(() => {})
402
+ await vi.advanceTimersByTimeAsync(150)
403
+
404
+ resolveTon({
405
+ networkId: 'tvm:-239',
406
+ address: 'EQton',
407
+ availableAddresses: [{ address: 'EQton', networkId: 'tvm:-239' }]
408
+ } as ConnectorResult)
409
+ await vi.advanceTimersByTimeAsync(10)
410
+
411
+ expect(sessionManager.getSession().connectionMode).toBe('tonConnect')
412
+ expect(connectionService['activeConnector']).toBe(tonConnector)
413
+ })
414
+
168
415
  it('does not fan out one tab-hide across superseded handoffs (at most one live handoff)', async () => {
169
416
  vi.useFakeTimers()
170
417
 
@@ -54,6 +54,15 @@ export class ConnectionService {
54
54
  ): Promise<void> {
55
55
  options?.signal?.throwIfAborted()
56
56
 
57
+ // Validate BEFORE touching any in-flight state. A lookup/validation failure
58
+ // (unknown walletId, unsupported mode, bad network) must not abort a valid
59
+ // prior in-flight attempt, nor leave a dangling `inFlightAbort` that a later
60
+ // connect() would spuriously abort (MFS-602).
61
+ const wallet = this.findWallet(walletId)
62
+ const provider = this.getProviderForMode(wallet, connectionMode)
63
+ const network = this.validateAndDetermineNetwork(networkId, provider)
64
+ const connector = this.getConnector(connectionMode)
65
+
57
66
  // Supersede any prior in-flight attempt: abort it so its URI poll and
58
67
  // handoff visibility listeners tear down (via the abort paths below) BEFORE
59
68
  // this attempt starts, instead of running alongside it (MFS-602). The
@@ -65,31 +74,19 @@ export class ConnectionService {
65
74
  const attemptAbort = new AbortController()
66
75
  this.inFlightAbort = attemptAbort
67
76
  const callerSignal = options?.signal
77
+ let removeCallerAbortListener: (() => void) | undefined
68
78
  if (callerSignal) {
69
79
  if (callerSignal.aborted) {
70
80
  attemptAbort.abort(callerSignal.reason)
71
81
  } else {
72
- callerSignal.addEventListener(
73
- 'abort',
74
- () => attemptAbort.abort(callerSignal.reason),
75
- { once: true }
76
- )
82
+ const onCallerAbort = () => attemptAbort.abort(callerSignal.reason)
83
+ callerSignal.addEventListener('abort', onCallerAbort, { once: true })
84
+ removeCallerAbortListener = () =>
85
+ callerSignal.removeEventListener('abort', onCallerAbort)
77
86
  }
78
87
  }
79
88
  const signal = attemptAbort.signal
80
89
 
81
- // Find the wallet
82
- const wallet = this.findWallet(walletId)
83
-
84
- // Get the appropriate provider based on connection mode
85
- const provider = this.getProviderForMode(wallet, connectionMode)
86
-
87
- // Validate and determine the network
88
- const network = this.validateAndDetermineNetwork(networkId, provider)
89
-
90
- // Get the appropriate connector
91
- const connector = this.getConnector(connectionMode)
92
-
93
90
  // Emit AFTER validation so a thrown lookup/validation error doesn't leave
94
91
  // listeners seeing a "connecting" state for an attempt that never started.
95
92
  this.eventManager.emit('connecting', { connectionMode, walletId })
@@ -157,18 +154,26 @@ export class ConnectionService {
157
154
  // stale activeConnector would keep serving the aborted attempt's URI.
158
155
  signal.throwIfAborted()
159
156
  } catch (error) {
160
- // Only release if WE are still the active attempt. A newer connect() that
161
- // superseded us has already installed its own connector and in-flight
162
- // token; nulling here would wrongly detach the live attempt (MFS-602).
163
- if (this.activeConnector === connector) this.activeConnector = null
164
- if (this.inFlightAbort === attemptAbort) this.inFlightAbort = null
157
+ // Only release if WE are still the in-flight attempt. Gate BOTH releases
158
+ // on the identity-unique `attemptAbort` token, never on
159
+ // `this.activeConnector === connector`: `connectors` is a shared singleton
160
+ // Map, so a same-mode re-entrant connect() reuses the IDENTICAL connector
161
+ // object a reference check would pass here and wrongly detach the newer,
162
+ // now-live attempt's connector, breaking its URI polling and leaving a
163
+ // later disconnect() unable to tear down the real wallet session (MFS-602).
164
+ if (this.inFlightAbort === attemptAbort) {
165
+ this.activeConnector = null
166
+ this.inFlightAbort = null
167
+ }
168
+ removeCallerAbortListener?.()
165
169
  throw error
166
170
  }
167
171
 
168
172
  // This attempt reached a successful handoff without being superseded (a
169
173
  // supersession aborts `signal`, which the belt-and-suspenders check above
170
- // turns into a throw). Release the in-flight handle.
174
+ // turns into a throw). Release the in-flight handle + caller-signal listener.
171
175
  if (this.inFlightAbort === attemptAbort) this.inFlightAbort = null
176
+ removeCallerAbortListener?.()
172
177
 
173
178
  // Filter available addresses to only include those for configured networks
174
179
  const filteredAvailableAddresses = result.availableAddresses.filter(addr =>
@@ -461,6 +466,15 @@ export class ConnectionService {
461
466
 
462
467
  async disconnect(options?: ServiceOptions): Promise<void> {
463
468
  options?.signal?.throwIfAborted()
469
+ // Cancel any in-flight connect() first. Without this, a wallet that responds
470
+ // AFTER the user disconnects would let the pending connect() proceed past its
471
+ // `signal.throwIfAborted()` guard into updateSession()/`connected`, resurrecting
472
+ // the session just torn down. Aborting the shared in-flight token makes that
473
+ // attempt bail via raceAbort (its late result is discarded). No-op on the
474
+ // normal path: a settled connect() already nulled `inFlightAbort` (MFS-602).
475
+ this.inFlightAbort?.abort(
476
+ new DOMException('Connection cancelled by disconnect', 'AbortError')
477
+ )
464
478
  // Remove the lifecycle listeners first so a provider 'disconnect' fired during
465
479
  // teardown doesn't re-enter as a wallet-initiated `walletDisconnected`.
466
480
  this.teardownLifecycle()
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  // Generated from package.json by scripts/generate-version.mjs — do not edit.
2
- export const UWC_CORE_VERSION = '1.1.1'
2
+ export const UWC_CORE_VERSION = '1.1.2'