@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.
- package/dist/services/connection-service.d.ts.map +1 -1
- package/dist/services/connection-service.js +31 -15
- package/dist/services/connection-service.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +5 -5
- package/src/services/connection-service.reentrancy.test.ts +252 -5
- package/src/services/connection-service.ts +37 -23
- package/src/version.ts +1 -1
|
@@ -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;
|
|
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
|
-
|
|
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
|
|
109
|
-
//
|
|
110
|
-
//
|
|
111
|
-
|
|
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":"AAaA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAG7D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAA;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAA;AAMnE,MAAM,OAAO,iBAAiB;IAclB;IACA;IACA;IACA;IACA;IACA;IAEA;IApBF,eAAe,GAAqB,IAAI,CAAA;IAChD,+EAA+E;IACvE,iBAAiB,CAA0B;IACnD;;;;;;OAMG;IACK,aAAa,GAA2B,IAAI,CAAA;IAEpD,YACU,QAAmB,EACnB,OAAyB,EACzB,cAA8B,EAC9B,UAA0C,EAC1C,sBAA+B,EAC/B,YAA0B;IAClC,yEAAyE;IACjE,uBAA+B;QAP/B,aAAQ,GAAR,QAAQ,CAAW;QACnB,YAAO,GAAP,OAAO,CAAkB;QACzB,mBAAc,GAAd,cAAc,CAAgB;QAC9B,eAAU,GAAV,UAAU,CAAgC;QAC1C,2BAAsB,GAAtB,sBAAsB,CAAS;QAC/B,iBAAY,GAAZ,YAAY,CAAc;QAE1B,4BAAuB,GAAvB,uBAAuB,CAAQ;IACtC,CAAC;IAEJ,KAAK,CAAC,OAAO,CACX,cAA8B,EAC9B,QAAgB,EAChB,SAAqB,EACrB,OAAwB;QAExB,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QAEjC,sEAAsE;QACtE,4EAA4E;QAC5E,sEAAsE;QACtE,2EAA2E;QAC3E,sDAAsD;QACtD,IAAI,CAAC,aAAa,EAAE,KAAK,CACvB,IAAI,YAAY,CAAC,0CAA0C,EAAE,YAAY,CAAC,CAC3E,CAAA;QACD,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAA;QAC1C,IAAI,CAAC,aAAa,GAAG,YAAY,CAAA;QACjC,MAAM,YAAY,GAAG,OAAO,EAAE,MAAM,CAAA;QACpC,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gBACzB,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YACzC,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,gBAAgB,CAC3B,OAAO,EACP,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,EAC7C,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAA;YACH,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAA;QAElC,kBAAkB;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QAExC,wDAAwD;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;QAEhE,qCAAqC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,2BAA2B,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QAErE,gCAAgC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAA;QAEnD,0EAA0E;QAC1E,2EAA2E;QAC3E,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAA;QAElE,wDAAwD;QACxD,uEAAuE;QACvE,IAAI,CAAC,eAAe,GAAG,SAAS,CAAA;QAEhC,IAAI,MAAM,CAAA;QACV,IAAI,CAAC;YACH,4EAA4E;YAC5E,0EAA0E;YAC1E,0EAA0E;YAC1E,8DAA8D;YAC9D,MAAM,GAAG,MAAM,iBAAiB,CAC9B;gBACE,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,SAAS,EAAE,IAAI,CAAC,uBAAuB;gBACvC,MAAM;aACP,EACD;gBACE,SAAS,EAAE,SAAS;gBACpB,cAAc;gBACd,QAAQ;gBACR,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,OAAO,EAAE,OAAO,CAAC,EAAE;aACpB,EACD,KAAK,IAAI,EAAE;gBACT,wEAAwE;gBACxE,oEAAoE;gBACpE,oEAAoE;gBACpE,yEAAyE;gBACzE,IAAI,cAAc,KAAK,UAAU,EAAE,CAAC;oBAClC,OAAO,MAAM,SAAS,CACpB,SAAS,CAAC,OAAO,CACf,OAAO,EACP,QAEqC,CACtC,EACD,MAAM,CACP,CAAA;gBACH,CAAC;qBAAM,IACL,cAAc,KAAK,YAAY;oBAC/B,cAAc,KAAK,eAAe,EAClC,CAAC;oBACD,OAAO,MAAM,SAAS,CACpB,IAAI,CAAC,kBAAkB,CACrB,SAAS,EACT,OAAO,EACP,QAAQ,EACR,cAAc,EACd,MAAM,CACP,EACD,MAAM,CACP,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,cAAc,EAAE,CAAC,CAAA;gBACnE,CAAC;YACH,CAAC,CACF,CAAA;YACD,uEAAuE;YACvE,wEAAwE;YACxE,qEAAqE;YACrE,sEAAsE;YACtE,MAAM,CAAC,cAAc,EAAE,CAAA;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0EAA0E;YAC1E,sEAAsE;YACtE,uEAAuE;YACvE,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS;gBAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;YACnE,IAAI,IAAI,CAAC,aAAa,KAAK,YAAY;gBAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;YAClE,MAAM,KAAK,CAAA;QACb,CAAC;QAED,wEAAwE;QACxE,0EAA0E;QAC1E,qDAAqD;QACrD,IAAI,IAAI,CAAC,aAAa,KAAK,YAAY;YAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;QAElE,2EAA2E;QAC3E,MAAM,0BAA0B,GAAG,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CACzE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,CACjD,CAAA;QAED,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;YAChC,cAAc;YACd,YAAY,EAAE,MAAM;YACpB,aAAa,EAAE,OAAO;YACtB,aAAa,EAAE,MAAM,CAAC,OAAO;YAC7B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;YACnC,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC1C,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAC5C;YACD,kBAAkB,EAAE,0BAA0B;SAC/C,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAA;QAChD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;QAChD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;QAErD,6EAA6E;QAC7E,6EAA6E;QAC7E,iDAAiD;QACjD,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;IACpE,CAAC;IAED,qFAAqF;IAC7E,eAAe,CACrB,cAA8B,EAC9B,QAAgB,EAChB,SAAoB,EACpB,aAAkD;QAElD,IAAI,CAAC,iBAAiB,EAAE,CAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAA;QACtC,IAAI,CAAC,iBAAiB,GAAG,eAAe,CAAC;YACvC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,uEAAuE;YACvE,4DAA4D;YAC5D,GAAG,CAAC,aAAa,IAAI,EAAE,aAAa,EAAE,CAAC;YACvC,0EAA0E;YAC1E,qEAAqE;YACrE,0DAA0D;YAC1D,SAAS,EAAE,SAAS,EAAE,gBAAgB;gBACpC,CAAC,CAAC,QAAQ,CAAC,EAAE,CACT,SAAS,CAAC,gBAAiB,CAAC,QAAQ,EAAE;oBACpC,cAAc;oBACd,SAAS;oBACT,QAAQ;iBACT,CAAC;gBACN,CAAC,CAAC,SAAS;YACb,UAAU,EAAE,GAAG,EAAE;gBACf,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAA;gBAC1C,OAAO;oBACL,cAAc,EAAE,CAAC,CAAC,cAAc,IAAI,cAAc;oBAClD,QAAQ,EAAE,CAAC,CAAC,YAAY,EAAE,EAAE,IAAI,QAAQ;oBACxC,SAAS,EAAE,CAAC,CAAC,aAAa,EAAE,SAAS,IAAI,SAAS;iBACnD,CAAA;YACH,CAAC;YACD,cAAc;YACd,QAAQ;YACR,SAAS;YACT,4EAA4E;YAC5E,6EAA6E;YAC7E,wEAAwE;YACxE,OAAO,EACJ,UAAsD;iBACpD,yBAAyB,KAAK,IAAI;gBACnC,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,QAAQ;SACf,CAAC,CAAA;IACJ,CAAC;IAED;;;;;;OAMG;IACH,iBAAiB;QACf,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAA;QAC1B,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAA;IACpC,CAAC;IAED;;;;;;;OAOG;IACH,iBAAiB;QACf,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAA;QAChD,IACE,CAAC,IAAI,CAAC,eAAe;YACrB,CAAC,OAAO,CAAC,cAAc;YACvB,CAAC,OAAO,CAAC,YAAY;YACrB,CAAC,OAAO,CAAC,aAAa,EACtB,CAAC;YACD,OAAM;QACR,CAAC;QACD,IAAI,CAAC,eAAe,CAClB,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,YAAY,CAAC,EAAE,EACvB,OAAO,CAAC,aAAa,CAAC,SAAS;QAC/B,yEAAyE;QACzE,wEAAwE;QACxE,wEAAwE;QACxE,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CACtD,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAC9B,SAAoB,EACpB,OAAgB,EAChB,QAA2B,EAC3B,cAA8B,EAC9B,MAAoB;QAEpB,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;QAE3D,IAAI,cAAc,GAAG,KAAK,CAAA;QAC1B,IAAI,UAA8B,CAAA;QAElC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YAClC,mEAAmE;YACnE,uEAAuE;YACvE,qEAAqE;YACrE,mEAAmE;YACnE,wEAAwE;YACxE,cAAc;YACd,IAAI,GAAuB,CAAA;YAC3B,IAAI,CAAC;gBACH,GAAG,GAAG,SAAS,CAAC,gBAAgB,EAAE,EAAE,CAAA;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,GAAG,SAAS,CAAA;YACjB,CAAC;YACD,IAAI,GAAG,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;gBAC9B,UAAU,GAAG,GAAG,CAAA;gBAChB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,CAAA;YAClE,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAA;QAEP,mFAAmF;QACnF,MAAM,iBAAiB,GAAG,UAAU,CAClC,GAAG,EAAE;YACH,WAAW,EAAE,CAAA;QACf,CAAC,EACD,CAAC,GAAG,EAAE,GAAG,IAAI,CACd,CAAA;QAED,SAAS,WAAW;YAClB,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAM;YACR,CAAC;YAED,cAAc,GAAG,IAAI,CAAA;YACrB,aAAa,CAAC,UAAU,CAAC,CAAA;YACzB,YAAY,CAAC,iBAAiB,CAAC,CAAA;YAC/B,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QACnD,CAAC;QAED,4EAA4E;QAC5E,0EAA0E;QAC1E,uEAAuE;QACvE,2EAA2E;QAC3E,kBAAkB;QAClB,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAE9D,IAAI,CAAC;YACH,OAAO,MAAM,cAAc,CAAA;QAC7B,CAAC;gBAAS,CAAC;YACT,WAAW,EAAE,CAAA;QACf,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,cAA8B;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;QACrD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,2CAA2C,cAAc,EAAE,CAC5D,CAAA;QACH,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAEO,UAAU,CAAC,QAAgB;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAA;QACxD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,aAAa,CAAC,CAAA;QAC3D,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAEO,kBAAkB,CACxB,MAAsB,EACtB,cAA8B;QAE9B,IAAI,QAAuC,CAAA;QAE3C,IAAI,cAAc,KAAK,UAAU,EAAE,CAAC;YAClC,QAAQ,GAAG,IAAI,CAAC,sBAAsB;gBACpC,CAAC,CAAC,MAAM,CAAC,iCAAiC;gBAC1C,CAAC,CAAC,MAAM,CAAC,yBAAyB,CAAA;YAEpC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CACb,IAAI,CAAC,sBAAsB;oBACzB,CAAC,CAAC,WAAW,MAAM,CAAC,EAAE,yDAAyD;oBAC/E,CAAC,CAAC,WAAW,MAAM,CAAC,EAAE,gDAAgD,CACzE,CAAA;YACH,CAAC;QACH,CAAC;aAAM,IAAI,cAAc,KAAK,YAAY,EAAE,CAAC;YAC3C,QAAQ,GAAG,MAAM,CAAC,kBAAkB,CAAA;YAEpC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CACb,WAAW,MAAM,CAAC,EAAE,wCAAwC,CAC7D,CAAA;YACH,CAAC;YAED,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAC5D,CAAC;aAAM,IAAI,cAAc,KAAK,eAAe,EAAE,CAAC;YAC9C,QAAQ,GAAG,MAAM,CAAC,qBAAqB,CAAA;YAEvC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CACb,WAAW,MAAM,CAAC,EAAE,0CAA0C,CAC/D,CAAA;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,cAAc,EAAE,CAAC,CAAA;QACnE,CAAC;QAED,OAAO,QAAQ,CAAA;IACjB,CAAC;IAEO,2BAA2B,CACjC,SAAgC,EAChC,QAA2B;QAE3B,IAAI,eAA0B,CAAA;QAE9B,IAAI,SAAS,EAAE,CAAC;YACd,mDAAmD;YACnD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAA;YACjE,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CACb,WAAW,SAAS,oCAAoC,CACzD,CAAA;YACH,CAAC;YAED,gDAAgD;YAChD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;YAC1E,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,WAAW,SAAS,iCAAiC,CAAC,CAAA;YACxE,CAAC;YAED,eAAe,GAAG,SAAS,CAAA;QAC7B,CAAC;aAAM,CAAC;YACN,qFAAqF;YACrF,MAAM,gBAAgB,GAAG,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAC9D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CACrC,CAAA;YACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,uEAAuE;gBACvE,wEAAwE;gBACxE,wEAAwE;gBACxE,MAAM,IAAI,oBAAoB,CAC5B,QAAQ,CAAC,mBAAmB,EAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAC7B,CAAA;YACH,CAAC;YACD,eAAe,GAAG,gBAAgB,CAAA;QACpC,CAAC;QAED,qCAAqC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,CAAA;QACjE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,WAAW,eAAe,mCAAmC,CAC9D,CAAA;QACH,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAwB;QACvC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACjC,+EAA+E;QAC/E,wEAAwE;QACxE,IAAI,CAAC,iBAAiB,EAAE,CAAA;QACxB,IAAI,CAAC;YACH,IACE,IAAI,CAAC,eAAe;gBACpB,OAAO,IAAI,CAAC,eAAe,CAAC,UAAU,KAAK,UAAU,EACrD,CAAC;gBACD,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAA;YACzC,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;YAC3B,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAA;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAA;YAChD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAA;YACjD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;IAED,gBAAgB;QACd,IACE,IAAI,CAAC,eAAe;YACpB,OAAO,IAAI,CAAC,eAAe,CAAC,gBAAgB,KAAK,UAAU,EAC3D,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAA;gBACnD,OAAO,GAAG,CAAA;YACZ,CAAC;YAAC,MAAM,CAAC;gBACP,oDAAoD;gBACpD,OAAO,SAAS,CAAA;YAClB,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,aAAa,CAAC,OAAyB;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED;;;;;;;;;;;;OAYG;IACK,wBAAwB,CAC9B,MAAsB,EACtB,QAAkC;QAElC,IAAI,QAAQ,CAAC,iBAAiB;YAAE,OAAO,QAAQ,CAAA;QAE/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,sBAAsB;YAClD,CAAC,CAAC,MAAM,CAAC,iCAAiC;YAC1C,CAAC,CAAC,MAAM,CAAC,yBAAyB,CAAA;QACpC,MAAM,WAAW,GAAG,gBAAgB,EAAE,iBAAiB,EAAE,GAAG,EAAE,WAAW,CAAA;QAEzE,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,EAAE,GAAG,QAAQ,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAA;QACxD,CAAC;QAED,OAAO,QAAQ,CAAA;IACjB,CAAC;CACF"}
|
|
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
|
+
export declare const UWC_CORE_VERSION = "1.1.2";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meshconnect/uwc-core",
|
|
3
|
-
"version": "1.1.
|
|
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
|
|
20
|
-
"@meshconnect/uwc-ton-connector": "0.7.1
|
|
21
|
-
"@meshconnect/uwc-types": "0.18.0
|
|
22
|
-
"@meshconnect/uwc-wallet-connect-connector": "0.7.1
|
|
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
|
-
//
|
|
82
|
-
//
|
|
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.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
|
161
|
-
//
|
|
162
|
-
//
|
|
163
|
-
|
|
164
|
-
|
|
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.
|
|
2
|
+
export const UWC_CORE_VERSION = '1.1.2'
|