@meshconnect/uwc-core 1.1.0 → 1.1.1-snapshot.a261258
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 +8 -0
- package/dist/services/connection-service.d.ts.map +1 -1
- package/dist/services/connection-service.js +55 -6
- 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 +190 -0
- package/src/services/connection-service.ts +59 -7
- package/src/version.ts +1 -1
|
@@ -15,6 +15,14 @@ export declare class ConnectionService {
|
|
|
15
15
|
private activeConnector;
|
|
16
16
|
/** Tears down the post-connect lifecycle subscription; set while connected. */
|
|
17
17
|
private lifecycleTeardown;
|
|
18
|
+
/**
|
|
19
|
+
* Abort handle for the CURRENT in-flight connect attempt. A re-entrant
|
|
20
|
+
* connect() aborts this before starting, so a superseded attempt's URI poll
|
|
21
|
+
* and handoff visibility listener are torn down instead of left running
|
|
22
|
+
* alongside the new one (MFS-602: orphaned polls/handoffs otherwise stack,
|
|
23
|
+
* each reading the shared activeConnector, and flood telemetry).
|
|
24
|
+
*/
|
|
25
|
+
private inFlightAbort;
|
|
18
26
|
constructor(networks: Network[], wallets: WalletMetadata[], sessionManager: SessionManager, connectors: Map<ConnectionMode, Connector>, usingIntegratedBrowser: boolean, eventManager: EventManager, walletResponseTimeoutMs: number);
|
|
19
27
|
connect(connectionMode: ConnectionMode, walletId: string, networkId?: NetworkId, options?: ServiceOptions): Promise<void>;
|
|
20
28
|
/** Wire the active connector's lifecycle stream onto the bus (or signal absence). */
|
|
@@ -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;
|
|
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"}
|
|
@@ -13,6 +13,14 @@ export class ConnectionService {
|
|
|
13
13
|
activeConnector = null;
|
|
14
14
|
/** Tears down the post-connect lifecycle subscription; set while connected. */
|
|
15
15
|
lifecycleTeardown;
|
|
16
|
+
/**
|
|
17
|
+
* Abort handle for the CURRENT in-flight connect attempt. A re-entrant
|
|
18
|
+
* connect() aborts this before starting, so a superseded attempt's URI poll
|
|
19
|
+
* and handoff visibility listener are torn down instead of left running
|
|
20
|
+
* alongside the new one (MFS-602: orphaned polls/handoffs otherwise stack,
|
|
21
|
+
* each reading the shared activeConnector, and flood telemetry).
|
|
22
|
+
*/
|
|
23
|
+
inFlightAbort = null;
|
|
16
24
|
constructor(networks, wallets, sessionManager, connectors, usingIntegratedBrowser, eventManager,
|
|
17
25
|
// Observational wallet-response deadline for the handoff timeout marker.
|
|
18
26
|
walletResponseTimeoutMs) {
|
|
@@ -26,6 +34,24 @@ export class ConnectionService {
|
|
|
26
34
|
}
|
|
27
35
|
async connect(connectionMode, walletId, networkId, options) {
|
|
28
36
|
options?.signal?.throwIfAborted();
|
|
37
|
+
// Supersede any prior in-flight attempt: abort it so its URI poll and
|
|
38
|
+
// handoff visibility listeners tear down (via the abort paths below) BEFORE
|
|
39
|
+
// this attempt starts, instead of running alongside it (MFS-602). The
|
|
40
|
+
// caller's own signal is composed in, so a caller abort still cancels this
|
|
41
|
+
// attempt while a re-entrant connect() supersedes it.
|
|
42
|
+
this.inFlightAbort?.abort(new DOMException('Superseded by a newer connection attempt', 'AbortError'));
|
|
43
|
+
const attemptAbort = new AbortController();
|
|
44
|
+
this.inFlightAbort = attemptAbort;
|
|
45
|
+
const callerSignal = options?.signal;
|
|
46
|
+
if (callerSignal) {
|
|
47
|
+
if (callerSignal.aborted) {
|
|
48
|
+
attemptAbort.abort(callerSignal.reason);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
callerSignal.addEventListener('abort', () => attemptAbort.abort(callerSignal.reason), { once: true });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const signal = attemptAbort.signal;
|
|
29
55
|
// Find the wallet
|
|
30
56
|
const wallet = this.findWallet(walletId);
|
|
31
57
|
// Get the appropriate provider based on connection mode
|
|
@@ -49,7 +75,7 @@ export class ConnectionService {
|
|
|
49
75
|
result = await instrumentHandoff({
|
|
50
76
|
eventManager: this.eventManager,
|
|
51
77
|
timeoutMs: this.walletResponseTimeoutMs,
|
|
52
|
-
signal
|
|
78
|
+
signal
|
|
53
79
|
}, {
|
|
54
80
|
operation: 'connect',
|
|
55
81
|
connectionMode,
|
|
@@ -62,11 +88,11 @@ export class ConnectionService {
|
|
|
62
88
|
// rejects the caller's await promptly. The underlying wallet prompt
|
|
63
89
|
// itself can't be cancelled, but the dapp UI is no longer blocked on it.
|
|
64
90
|
if (connectionMode === 'injected') {
|
|
65
|
-
return await raceAbort(connector.connect(network, provider),
|
|
91
|
+
return await raceAbort(connector.connect(network, provider), signal);
|
|
66
92
|
}
|
|
67
93
|
else if (connectionMode === 'tonConnect' ||
|
|
68
94
|
connectionMode === 'walletConnect') {
|
|
69
|
-
return await raceAbort(this.connectWithURIPoll(connector, network, provider, connectionMode,
|
|
95
|
+
return await raceAbort(this.connectWithURIPoll(connector, network, provider, connectionMode, signal), signal);
|
|
70
96
|
}
|
|
71
97
|
else {
|
|
72
98
|
throw new Error(`Unsupported connection mode: ${connectionMode}`);
|
|
@@ -76,12 +102,23 @@ export class ConnectionService {
|
|
|
76
102
|
// and this point, still bail before mutating session. Inside the try so
|
|
77
103
|
// the half-attached connector is released on this late abort too — a
|
|
78
104
|
// stale activeConnector would keep serving the aborted attempt's URI.
|
|
79
|
-
|
|
105
|
+
signal.throwIfAborted();
|
|
80
106
|
}
|
|
81
107
|
catch (error) {
|
|
82
|
-
|
|
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)
|
|
112
|
+
this.activeConnector = null;
|
|
113
|
+
if (this.inFlightAbort === attemptAbort)
|
|
114
|
+
this.inFlightAbort = null;
|
|
83
115
|
throw error;
|
|
84
116
|
}
|
|
117
|
+
// This attempt reached a successful handoff without being superseded (a
|
|
118
|
+
// supersession aborts `signal`, which the belt-and-suspenders check above
|
|
119
|
+
// turns into a throw). Release the in-flight handle.
|
|
120
|
+
if (this.inFlightAbort === attemptAbort)
|
|
121
|
+
this.inFlightAbort = null;
|
|
85
122
|
// Filter available addresses to only include those for configured networks
|
|
86
123
|
const filteredAvailableAddresses = result.availableAddresses.filter(addr => this.networks.some(n => n.id === addr.networkId));
|
|
87
124
|
this.sessionManager.updateSession({
|
|
@@ -178,7 +215,19 @@ export class ConnectionService {
|
|
|
178
215
|
let pollingStopped = false;
|
|
179
216
|
let emittedUri;
|
|
180
217
|
const pollForURI = setInterval(() => {
|
|
181
|
-
|
|
218
|
+
// Read the URI from THIS attempt's own connector, never the shared
|
|
219
|
+
// this.activeConnector: a still-running poll from a superseded attempt
|
|
220
|
+
// would otherwise read — and emit — a newer attempt's URI under this
|
|
221
|
+
// attempt's connectionMode (MFS-602 cross-talk). Mirror the public
|
|
222
|
+
// getConnectionURI guard: the getter is optional and may throw before a
|
|
223
|
+
// URI exists.
|
|
224
|
+
let uri;
|
|
225
|
+
try {
|
|
226
|
+
uri = connector.getConnectionURI?.();
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
uri = undefined;
|
|
230
|
+
}
|
|
182
231
|
if (uri && uri !== emittedUri) {
|
|
183
232
|
emittedUri = uri;
|
|
184
233
|
this.eventManager.emit('connectionUri', { uri, connectionMode });
|
|
@@ -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;IAMlB;IACA;IACA;IACA;IACA;IACA;IAEA;IAZF,eAAe,GAAqB,IAAI,CAAA;IAChD,+EAA+E;IACvE,iBAAiB,CAA0B;IAEnD,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,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,EAAE,OAAO,EAAE,MAAM;aACxB,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,OAAO,EAAE,MAAM,CAChB,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,OAAO,EAAE,MAAM,CAChB,EACD,OAAO,EAAE,MAAM,CAChB,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,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;YAC3B,MAAM,KAAK,CAAA;QACb,CAAC;QAED,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,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAA;YACnC,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.1";
|
|
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.1-snapshot.a261258",
|
|
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.
|
|
20
|
-
"@meshconnect/uwc-ton-connector": "0.7.
|
|
21
|
-
"@meshconnect/uwc-types": "0.
|
|
22
|
-
"@meshconnect/uwc-wallet-connect-connector": "0.7.
|
|
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"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"typescript": "^5.9.3"
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'
|
|
2
|
+
import { ConnectionService } from './connection-service'
|
|
3
|
+
import { SessionManager } from '../managers/session-manager'
|
|
4
|
+
import { EventManager } from '../managers/event-manager'
|
|
5
|
+
import type {
|
|
6
|
+
Network,
|
|
7
|
+
WalletMetadata,
|
|
8
|
+
ConnectionMode,
|
|
9
|
+
Connector
|
|
10
|
+
} from '@meshconnect/uwc-types'
|
|
11
|
+
|
|
12
|
+
// MFS-602: connect() must be re-entrancy safe.
|
|
13
|
+
//
|
|
14
|
+
// A second connect() entered while a prior URI-poll handoff is still live must
|
|
15
|
+
// SUPERSEDE the prior attempt — tear down its poll interval and its
|
|
16
|
+
// visibility listener — rather than run alongside it. Without this, orphaned
|
|
17
|
+
// polls stack (each reading the SHARED activeConnector) and orphaned handoffs
|
|
18
|
+
// each fire on every tab-visibility change. That is the mechanism behind the
|
|
19
|
+
// prod burst seen after PR #340 wired UWC telemetry to Datadog RUM
|
|
20
|
+
// (uwc.connectionUri 63k/48k + uwc.pageHiddenDuringHandoff 11.8k, one session).
|
|
21
|
+
//
|
|
22
|
+
// The existing "does not emit connectionUri with the aborted session's
|
|
23
|
+
// connectionMode for a later connect" test (connection-service.test.ts) proves
|
|
24
|
+
// the CALLER-abort path is clean. These tests prove the same invariants hold
|
|
25
|
+
// when the prior attempt is superseded by re-entry with NO explicit abort.
|
|
26
|
+
describe('MFS-602: ConnectionService.connect() re-entrancy safety', () => {
|
|
27
|
+
let connectionService: ConnectionService
|
|
28
|
+
let sessionManager: SessionManager
|
|
29
|
+
let eventManager: EventManager
|
|
30
|
+
let network: Network
|
|
31
|
+
let wallets: WalletMetadata[]
|
|
32
|
+
let connectors: Map<ConnectionMode, Connector>
|
|
33
|
+
let wcConnector: Connector
|
|
34
|
+
let tonConnector: Connector
|
|
35
|
+
|
|
36
|
+
beforeEach(() => {
|
|
37
|
+
sessionManager = new SessionManager()
|
|
38
|
+
eventManager = new EventManager()
|
|
39
|
+
|
|
40
|
+
network = {
|
|
41
|
+
id: 'tvm:-239',
|
|
42
|
+
internalId: -239,
|
|
43
|
+
name: 'TON',
|
|
44
|
+
namespace: 'tvm',
|
|
45
|
+
logoUrl: 'https://ton.org/logo.svg',
|
|
46
|
+
networkType: 'tvm',
|
|
47
|
+
nativeCurrency: { name: 'Toncoin', symbol: 'TON', decimals: 9 }
|
|
48
|
+
} as unknown as Network
|
|
49
|
+
|
|
50
|
+
wallets = [
|
|
51
|
+
{
|
|
52
|
+
id: 'tonkeeper',
|
|
53
|
+
name: 'Tonkeeper',
|
|
54
|
+
metadata: { icon: '', downloadUrl: '' },
|
|
55
|
+
walletConnectProvider: { supportedNetworkIds: ['tvm:-239'] },
|
|
56
|
+
tonConnectProvider: { supportedNetworkIds: ['tvm:-239'] }
|
|
57
|
+
} as unknown as WalletMetadata
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
// connect() never settles on its own — models a wallet prompt / WC proposal
|
|
61
|
+
// left pending, so a poll is only ever stopped by supersession, abort, or
|
|
62
|
+
// the 5-min watchdog.
|
|
63
|
+
wcConnector = {
|
|
64
|
+
connect: vi.fn().mockReturnValue(new Promise(() => {})),
|
|
65
|
+
disconnect: vi.fn(),
|
|
66
|
+
switchNetwork: vi.fn(),
|
|
67
|
+
getConnectionURI: vi.fn().mockReturnValue('wc://uri')
|
|
68
|
+
} as unknown as Connector
|
|
69
|
+
|
|
70
|
+
tonConnector = {
|
|
71
|
+
connect: vi.fn().mockReturnValue(new Promise(() => {})),
|
|
72
|
+
disconnect: vi.fn(),
|
|
73
|
+
switchNetwork: vi.fn(),
|
|
74
|
+
getConnectionURI: vi.fn().mockReturnValue('tc://ton-uri')
|
|
75
|
+
} as unknown as Connector
|
|
76
|
+
|
|
77
|
+
connectors = new Map()
|
|
78
|
+
connectors.set('walletConnect', wcConnector)
|
|
79
|
+
connectors.set('tonConnect', tonConnector)
|
|
80
|
+
|
|
81
|
+
// No wallet-response timeout (arg omitted) so the only timers in play are
|
|
82
|
+
// the poll interval + its watchdog — keeps getTimerCount() unambiguous.
|
|
83
|
+
connectionService = new ConnectionService(
|
|
84
|
+
[network],
|
|
85
|
+
wallets,
|
|
86
|
+
sessionManager,
|
|
87
|
+
connectors,
|
|
88
|
+
false,
|
|
89
|
+
eventManager
|
|
90
|
+
)
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
afterEach(() => {
|
|
94
|
+
vi.useRealTimers()
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
it('supersedes a prior pending attempt: only one poll stays live (timers bounded)', async () => {
|
|
98
|
+
vi.useFakeTimers()
|
|
99
|
+
|
|
100
|
+
// Baseline: a single attempt arms exactly one poll (interval + watchdog).
|
|
101
|
+
connectionService.connect('walletConnect', 'tonkeeper').catch(() => {})
|
|
102
|
+
await vi.advanceTimersByTimeAsync(150)
|
|
103
|
+
const timersOneAttempt = vi.getTimerCount()
|
|
104
|
+
|
|
105
|
+
// A second, overlapping attempt (different mode) must supersede the first,
|
|
106
|
+
// not stack. Live timer count must stay at the single-attempt level.
|
|
107
|
+
connectionService.connect('tonConnect', 'tonkeeper').catch(() => {})
|
|
108
|
+
await vi.advanceTimersByTimeAsync(150)
|
|
109
|
+
|
|
110
|
+
expect(vi.getTimerCount()).toBe(timersOneAttempt)
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
it('rejects the superseded attempt’s promise (no pending-promise leak)', async () => {
|
|
114
|
+
vi.useFakeTimers()
|
|
115
|
+
|
|
116
|
+
// NB: asserting getConnectionURI call-count on the superseded connector is
|
|
117
|
+
// NOT a valid detector — the orphaned poll reads the SHARED activeConnector,
|
|
118
|
+
// so it stops hitting its own connector's mock even while the interval is
|
|
119
|
+
// still alive (that stop IS the cross-talk). The observable, leak-relevant
|
|
120
|
+
// invariant is that the caller's await for the superseded attempt settles.
|
|
121
|
+
let priorRejected = false
|
|
122
|
+
connectionService.connect('walletConnect', 'tonkeeper').then(
|
|
123
|
+
() => {},
|
|
124
|
+
() => {
|
|
125
|
+
priorRejected = true
|
|
126
|
+
}
|
|
127
|
+
)
|
|
128
|
+
await vi.advanceTimersByTimeAsync(150)
|
|
129
|
+
|
|
130
|
+
// Re-enter — the prior attempt must be superseded, not left pending forever.
|
|
131
|
+
connectionService.connect('tonConnect', 'tonkeeper').catch(() => {})
|
|
132
|
+
await vi.advanceTimersByTimeAsync(10)
|
|
133
|
+
|
|
134
|
+
expect(priorRejected).toBe(true)
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
it('never emits a connectionUri tagged with a superseded attempt’s mode (no cross-talk)', async () => {
|
|
138
|
+
vi.useFakeTimers()
|
|
139
|
+
|
|
140
|
+
// WC attempt has no URI of its own, so any WC-tagged emission can only come
|
|
141
|
+
// from the orphaned poll reading a later attempt's connector.
|
|
142
|
+
wcConnector.getConnectionURI = vi.fn().mockReturnValue(undefined)
|
|
143
|
+
|
|
144
|
+
const uriEmits: Array<{ uri: string; connectionMode: ConnectionMode }> = []
|
|
145
|
+
eventManager.on('connectionUri', e =>
|
|
146
|
+
uriEmits.push(e as { uri: string; connectionMode: ConnectionMode })
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
// 1) walletConnect attempt, pending, NEVER aborted.
|
|
150
|
+
connectionService.connect('walletConnect', 'tonkeeper').catch(() => {})
|
|
151
|
+
await vi.advanceTimersByTimeAsync(150)
|
|
152
|
+
|
|
153
|
+
// 2) A later tonConnect attempt supersedes it and has a URI.
|
|
154
|
+
connectionService.connect('tonConnect', 'tonkeeper').catch(() => {})
|
|
155
|
+
await vi.advanceTimersByTimeAsync(300)
|
|
156
|
+
|
|
157
|
+
const mislabeled = uriEmits.find(e => e.connectionMode === 'walletConnect')
|
|
158
|
+
expect(mislabeled).toBeUndefined()
|
|
159
|
+
|
|
160
|
+
// Sanity: the live TON attempt still emits its own URI, correctly tagged.
|
|
161
|
+
expect(
|
|
162
|
+
uriEmits.some(
|
|
163
|
+
e => e.connectionMode === 'tonConnect' && e.uri === 'tc://ton-uri'
|
|
164
|
+
)
|
|
165
|
+
).toBe(true)
|
|
166
|
+
})
|
|
167
|
+
|
|
168
|
+
it('does not fan out one tab-hide across superseded handoffs (at most one live handoff)', async () => {
|
|
169
|
+
vi.useFakeTimers()
|
|
170
|
+
|
|
171
|
+
const hidden: unknown[] = []
|
|
172
|
+
eventManager.on('pageHiddenDuringHandoff', e => hidden.push(e))
|
|
173
|
+
|
|
174
|
+
// Fire several overlapping connects; each must supersede the previous, so
|
|
175
|
+
// only the last handoff's visibility listener remains attached.
|
|
176
|
+
for (let i = 0; i < 5; i++) {
|
|
177
|
+
connectionService.connect('walletConnect', 'tonkeeper').catch(() => {})
|
|
178
|
+
}
|
|
179
|
+
// Flush microtasks so superseded handoffs finish tearing down.
|
|
180
|
+
await vi.advanceTimersByTimeAsync(10)
|
|
181
|
+
|
|
182
|
+
Object.defineProperty(document, 'visibilityState', {
|
|
183
|
+
value: 'hidden',
|
|
184
|
+
configurable: true
|
|
185
|
+
})
|
|
186
|
+
document.dispatchEvent(new Event('visibilitychange'))
|
|
187
|
+
|
|
188
|
+
expect(hidden).toHaveLength(1)
|
|
189
|
+
})
|
|
190
|
+
})
|
|
@@ -26,6 +26,14 @@ export class ConnectionService {
|
|
|
26
26
|
private activeConnector: Connector | null = null
|
|
27
27
|
/** Tears down the post-connect lifecycle subscription; set while connected. */
|
|
28
28
|
private lifecycleTeardown: (() => void) | undefined
|
|
29
|
+
/**
|
|
30
|
+
* Abort handle for the CURRENT in-flight connect attempt. A re-entrant
|
|
31
|
+
* connect() aborts this before starting, so a superseded attempt's URI poll
|
|
32
|
+
* and handoff visibility listener are torn down instead of left running
|
|
33
|
+
* alongside the new one (MFS-602: orphaned polls/handoffs otherwise stack,
|
|
34
|
+
* each reading the shared activeConnector, and flood telemetry).
|
|
35
|
+
*/
|
|
36
|
+
private inFlightAbort: AbortController | null = null
|
|
29
37
|
|
|
30
38
|
constructor(
|
|
31
39
|
private networks: Network[],
|
|
@@ -46,6 +54,30 @@ export class ConnectionService {
|
|
|
46
54
|
): Promise<void> {
|
|
47
55
|
options?.signal?.throwIfAborted()
|
|
48
56
|
|
|
57
|
+
// Supersede any prior in-flight attempt: abort it so its URI poll and
|
|
58
|
+
// handoff visibility listeners tear down (via the abort paths below) BEFORE
|
|
59
|
+
// this attempt starts, instead of running alongside it (MFS-602). The
|
|
60
|
+
// caller's own signal is composed in, so a caller abort still cancels this
|
|
61
|
+
// attempt while a re-entrant connect() supersedes it.
|
|
62
|
+
this.inFlightAbort?.abort(
|
|
63
|
+
new DOMException('Superseded by a newer connection attempt', 'AbortError')
|
|
64
|
+
)
|
|
65
|
+
const attemptAbort = new AbortController()
|
|
66
|
+
this.inFlightAbort = attemptAbort
|
|
67
|
+
const callerSignal = options?.signal
|
|
68
|
+
if (callerSignal) {
|
|
69
|
+
if (callerSignal.aborted) {
|
|
70
|
+
attemptAbort.abort(callerSignal.reason)
|
|
71
|
+
} else {
|
|
72
|
+
callerSignal.addEventListener(
|
|
73
|
+
'abort',
|
|
74
|
+
() => attemptAbort.abort(callerSignal.reason),
|
|
75
|
+
{ once: true }
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const signal = attemptAbort.signal
|
|
80
|
+
|
|
49
81
|
// Find the wallet
|
|
50
82
|
const wallet = this.findWallet(walletId)
|
|
51
83
|
|
|
@@ -76,7 +108,7 @@ export class ConnectionService {
|
|
|
76
108
|
{
|
|
77
109
|
eventManager: this.eventManager,
|
|
78
110
|
timeoutMs: this.walletResponseTimeoutMs,
|
|
79
|
-
signal
|
|
111
|
+
signal
|
|
80
112
|
},
|
|
81
113
|
{
|
|
82
114
|
operation: 'connect',
|
|
@@ -98,7 +130,7 @@ export class ConnectionService {
|
|
|
98
130
|
| ExtensionInjectedProvider
|
|
99
131
|
| IntegratedBrowserInjectedProvider
|
|
100
132
|
),
|
|
101
|
-
|
|
133
|
+
signal
|
|
102
134
|
)
|
|
103
135
|
} else if (
|
|
104
136
|
connectionMode === 'tonConnect' ||
|
|
@@ -110,9 +142,9 @@ export class ConnectionService {
|
|
|
110
142
|
network,
|
|
111
143
|
provider,
|
|
112
144
|
connectionMode,
|
|
113
|
-
|
|
145
|
+
signal
|
|
114
146
|
),
|
|
115
|
-
|
|
147
|
+
signal
|
|
116
148
|
)
|
|
117
149
|
} else {
|
|
118
150
|
throw new Error(`Unsupported connection mode: ${connectionMode}`)
|
|
@@ -123,12 +155,21 @@ export class ConnectionService {
|
|
|
123
155
|
// and this point, still bail before mutating session. Inside the try so
|
|
124
156
|
// the half-attached connector is released on this late abort too — a
|
|
125
157
|
// stale activeConnector would keep serving the aborted attempt's URI.
|
|
126
|
-
|
|
158
|
+
signal.throwIfAborted()
|
|
127
159
|
} catch (error) {
|
|
128
|
-
|
|
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
|
|
129
165
|
throw error
|
|
130
166
|
}
|
|
131
167
|
|
|
168
|
+
// This attempt reached a successful handoff without being superseded (a
|
|
169
|
+
// supersession aborts `signal`, which the belt-and-suspenders check above
|
|
170
|
+
// turns into a throw). Release the in-flight handle.
|
|
171
|
+
if (this.inFlightAbort === attemptAbort) this.inFlightAbort = null
|
|
172
|
+
|
|
132
173
|
// Filter available addresses to only include those for configured networks
|
|
133
174
|
const filteredAvailableAddresses = result.availableAddresses.filter(addr =>
|
|
134
175
|
this.networks.some(n => n.id === addr.networkId)
|
|
@@ -257,7 +298,18 @@ export class ConnectionService {
|
|
|
257
298
|
let emittedUri: string | undefined
|
|
258
299
|
|
|
259
300
|
const pollForURI = setInterval(() => {
|
|
260
|
-
|
|
301
|
+
// Read the URI from THIS attempt's own connector, never the shared
|
|
302
|
+
// this.activeConnector: a still-running poll from a superseded attempt
|
|
303
|
+
// would otherwise read — and emit — a newer attempt's URI under this
|
|
304
|
+
// attempt's connectionMode (MFS-602 cross-talk). Mirror the public
|
|
305
|
+
// getConnectionURI guard: the getter is optional and may throw before a
|
|
306
|
+
// URI exists.
|
|
307
|
+
let uri: string | undefined
|
|
308
|
+
try {
|
|
309
|
+
uri = connector.getConnectionURI?.()
|
|
310
|
+
} catch {
|
|
311
|
+
uri = undefined
|
|
312
|
+
}
|
|
261
313
|
if (uri && uri !== emittedUri) {
|
|
262
314
|
emittedUri = uri
|
|
263
315
|
this.eventManager.emit('connectionUri', { uri, connectionMode })
|
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.1'
|