@meshconnect/uwc-types 0.19.0 → 0.20.0-snapshot.3bf4b70

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.
@@ -44,6 +44,12 @@ export interface ConnectorResult {
44
44
  address: string;
45
45
  availableAddresses: AvailableAddress[];
46
46
  publicKey?: string;
47
+ /**
48
+ * True when the connector satisfied this connect() by adopting a live stored
49
+ * session instead of a fresh pairing (WalletConnect session reuse, MFS-642).
50
+ * Propagated onto the Session for observability. Absent = fresh connect.
51
+ */
52
+ reused?: boolean;
47
53
  }
48
54
  /**
49
55
  * Result interface for network switch operations
@@ -53,6 +59,21 @@ export interface SwitchNetworkResult {
53
59
  address: string;
54
60
  availableAddresses?: AvailableAddress[];
55
61
  }
62
+ /**
63
+ * Optional per-call hints for connect(). Additive and connector-agnostic —
64
+ * connectors that do not use a field simply ignore it.
65
+ */
66
+ export interface ConnectOptions {
67
+ /**
68
+ * Display name of the wallet the user selected (from the catalog). The
69
+ * WalletConnect connector keys its session-reuse record on this trusted name:
70
+ * it only ever re-adopts a session it previously recorded for the same selected
71
+ * wallet, never one established by another (possibly rogue) peer. Ignored by
72
+ * connectors without session reuse; absence disables reuse (fresh pairing is
73
+ * always safe).
74
+ */
75
+ walletName?: string;
76
+ }
56
77
  /**
57
78
  * Common interface for all wallet connectors
58
79
  */
@@ -63,7 +84,7 @@ export interface Connector {
63
84
  * @param args Additional arguments specific to the connector type
64
85
  * @returns A promise that resolves to a ConnectorResult containing the network ID, wallet address, and available addresses
65
86
  */
66
- connect(network: Network, provider?: ExtensionInjectedProvider | IntegratedBrowserInjectedProvider | WalletConnectProvider | TonConnectWalletProvider): Promise<ConnectorResult>;
87
+ connect(network: Network, provider?: ExtensionInjectedProvider | IntegratedBrowserInjectedProvider | WalletConnectProvider | TonConnectWalletProvider, options?: ConnectOptions): Promise<ConnectorResult>;
67
88
  /**
68
89
  * Get the connection URI for the wallet, if applicable
69
90
  * This is typically used for WalletConnect or similar protocols
@@ -73,6 +94,18 @@ export interface Connector {
73
94
  * @remarks This method is optional and may not be implemented by all connectors.
74
95
  */
75
96
  getConnectionURI?(): string;
97
+ /**
98
+ * Pre-generate a connection pairing (URI) ahead of wallet selection, WITHOUT
99
+ * waiting for approval. Warms the transport (e.g. opens the WalletConnect relay
100
+ * socket on a cold client) and returns a URI the caller can deep-link inside a
101
+ * user gesture; a subsequent `connect()` adopts the same pairing so the URI the
102
+ * user approves matches the one opened. Optional — only connectors with a
103
+ * pairing step (WalletConnect) implement it.
104
+ * @param provider Only `supportedNetworkIds` is required (pass the UNION of the
105
+ * session's WalletConnect wallets' networks so one pairing serves any wallet).
106
+ * @returns The pairing URI.
107
+ */
108
+ beginPairing?(provider: Pick<WalletConnectProvider, 'supportedNetworkIds'>): Promise<string>;
76
109
  /**
77
110
  * Disconnect from the wallet
78
111
  * This method is optional and may not be implemented by all connectors.
@@ -1 +1 @@
1
- {"version":3,"file":"connector.d.ts","sourceRoot":"","sources":["../src/connector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connector.d.ts","sourceRoot":"","sources":["../src/connector.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,38 @@
11
11
  * wires them to whatever backend they run (Datadog, Amplitude, Segment, …).
12
12
  */
13
13
  export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
14
+ /**
15
+ * Why an opt-in WalletConnect session-reuse attempt fell back to a fresh pairing
16
+ * instead of adopting a stored session (MFS-642). Small, stable enum so it can
17
+ * drive a reuse-outcome dashboard without high cardinality. Emitted via
18
+ * `WalletConnectConfig.onSessionReuseSkipped`.
19
+ *
20
+ * - `no_record` — no topic recorded for the selected wallet (e.g. first connect),
21
+ * or the recorded session is no longer in storage.
22
+ * - `expired` — the recorded session exists but is past its expiry.
23
+ * - `no_address` — the session carries no account for the requested network.
24
+ * - `ping_timeout`— the liveness ping got NO ack within the bounded window (peer
25
+ * slow/suspended or the relay socket is dead — CARE-263). Split
26
+ * from `ping_error` so a slow-but-alive mobile wallet (which
27
+ * would defeat reuse if the window is too tight) is measurable
28
+ * separately from a hard failure.
29
+ * - `ping_error` — the ping REJECTED (offline / relay / protocol error), i.e. an
30
+ * unknown liveness state rather than a confirmed no-ack.
31
+ * - `superseded` — a disconnect()/newer connect() invalidated the attempt mid-ping.
32
+ */
33
+ export type WalletConnectSessionReuseSkipReason = 'no_record' | 'expired' | 'no_address' | 'ping_timeout' | 'ping_error' | 'superseded';
34
+ /**
35
+ * Payload for `WalletConnectConfig.onSessionReuseSkipped`. Carries the coarse
36
+ * reason plus, for the two ping outcomes, the ping round-trip in ms — so a
37
+ * consumer can chart the ping-latency distribution and decide whether the bound
38
+ * is clipping live-but-slow wallets. (The healthy-ping latency is separately
39
+ * observable as the reused connect's own handoff duration.)
40
+ */
41
+ export interface WalletConnectSessionReuseSkip {
42
+ reason: WalletConnectSessionReuseSkipReason;
43
+ /** Ping round-trip in ms; present only for `ping_timeout` / `ping_error`. */
44
+ pingMs?: number;
45
+ }
14
46
  /**
15
47
  * Pluggable logger. The default implementation (`createLogger`) is console-backed
16
48
  * and level-gated; inject your own to redirect UWC's internal logging into your
@@ -1 +1 @@
1
- {"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../src/observability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAE1D;;;;;GAKG;AACH,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IAChD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IAC/C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IAC/C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CACjD;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,cAAc,GACtB,wBAAwB,GACxB,+BAA+B,GAC/B,wBAAwB,GACxB,qBAAqB,GACrB,cAAc,GACd,qBAAqB,GACrB,4BAA4B,GAC5B,wBAAwB,GACxB,SAAS,CAAA;AAEb;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAA;AAEnE;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GACnB,eAAe,GACf,gBAAgB,GAChB,cAAc,GACd,eAAe;AACjB,iFAAiF;GAC/E,mBAAmB,GACnB,oBAAoB,GACpB,gBAAgB,GAChB,SAAS;AACX,gFAAgF;GAC9E,oBAAoB,GACpB,SAAS,CAAA;AAEb;;;;GAIG;AACH,MAAM,MAAM,WAAW,GACnB,UAAU,GACV,WAAW,GACX,QAAQ,GACR,KAAK,GACL,SAAS,CAAA;AAEb;;;;GAIG;AACH,MAAM,MAAM,0BAA0B;AACpC,gGAAgG;AAC9F,mCAAmC;AACrC,uFAAuF;GACrF,iCAAiC;AACnC,oEAAoE;GAClE,uBAAuB;AACzB;;;;GAIG;GACD,mBAAmB;AACrB;;;GAGG;GACD,cAAc,CAAA"}
1
+ {"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../src/observability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAE1D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,mCAAmC,GAC3C,WAAW,GACX,SAAS,GACT,YAAY,GACZ,cAAc,GACd,YAAY,GACZ,YAAY,CAAA;AAEhB;;;;;;GAMG;AACH,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,mCAAmC,CAAA;IAC3C,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;GAKG;AACH,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IAChD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IAC/C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IAC/C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CACjD;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,cAAc,GACtB,wBAAwB,GACxB,+BAA+B,GAC/B,wBAAwB,GACxB,qBAAqB,GACrB,cAAc,GACd,qBAAqB,GACrB,4BAA4B,GAC5B,wBAAwB,GACxB,SAAS,CAAA;AAEb;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAA;AAEnE;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GACnB,eAAe,GACf,gBAAgB,GAChB,cAAc,GACd,eAAe;AACjB,iFAAiF;GAC/E,mBAAmB,GACnB,oBAAoB,GACpB,gBAAgB,GAChB,SAAS;AACX,gFAAgF;GAC9E,oBAAoB,GACpB,SAAS,CAAA;AAEb;;;;GAIG;AACH,MAAM,MAAM,WAAW,GACnB,UAAU,GACV,WAAW,GACX,QAAQ,GACR,KAAK,GACL,SAAS,CAAA;AAEb;;;;GAIG;AACH,MAAM,MAAM,0BAA0B;AACpC,gGAAgG;AAC9F,mCAAmC;AACrC,uFAAuF;GACrF,iCAAiC;AACnC,oEAAoE;GAClE,uBAAuB;AACzB;;;;GAIG;GACD,mBAAmB;AACrB;;;GAGG;GACD,cAAc,CAAA"}
package/dist/session.d.ts CHANGED
@@ -16,5 +16,14 @@ export interface Session {
16
16
  availableNetworks: Network[];
17
17
  activeWallet: WalletMetadata | null;
18
18
  availableAddresses: AvailableAddress[];
19
+ /**
20
+ * Connection provenance: true when this session was adopted from a live stored
21
+ * WalletConnect session (MFS-642 reuse) rather than established by a fresh
22
+ * pairing handshake. Drives observability — it rides the `connected` telemetry
23
+ * and every subsequent operation handoff so success/error/timeout of reused
24
+ * sessions can be evaluated and triaged separately from fresh ones. Absent/false
25
+ * for fresh pairings and all non-WalletConnect connections.
26
+ */
27
+ reused?: boolean;
19
28
  }
20
29
  //# sourceMappingURL=session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,SAAS,CAAA;CACrB;AAED,MAAM,WAAW,OAAO;IACtB,cAAc,EAAE,cAAc,GAAG,IAAI,CAAA;IACrC,aAAa,EAAE,OAAO,GAAG,IAAI,CAAA;IAC7B,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI,CAAA;IAChE,+BAA+B,EAAE,eAAe,GAAG,IAAI,CAAA;IACvD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,iBAAiB,EAAE,OAAO,EAAE,CAAA;IAC5B,YAAY,EAAE,cAAc,GAAG,IAAI,CAAA;IACnC,kBAAkB,EAAE,gBAAgB,EAAE,CAAA;CACvC"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,SAAS,CAAA;CACrB;AAED,MAAM,WAAW,OAAO;IACtB,cAAc,EAAE,cAAc,GAAG,IAAI,CAAA;IACrC,aAAa,EAAE,OAAO,GAAG,IAAI,CAAA;IAC7B,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI,CAAA;IAChE,+BAA+B,EAAE,eAAe,GAAG,IAAI,CAAA;IACvD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,iBAAiB,EAAE,OAAO,EAAE,CAAA;IAC5B,YAAY,EAAE,cAAc,GAAG,IAAI,CAAA;IACnC,kBAAkB,EAAE,gBAAgB,EAAE,CAAA;IACtC;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB"}
@@ -1,3 +1,4 @@
1
+ import type { WalletConnectSessionReuseSkip } from './observability';
1
2
  /**
2
3
  * Configuration for WalletConnect connector
3
4
  */
@@ -9,5 +10,52 @@ export interface WalletConnectConfig {
9
10
  url: string;
10
11
  icons: string[];
11
12
  };
13
+ /**
14
+ * Opt-in: reuse a live WalletConnect session persisted in storage instead of
15
+ * forcing a fresh pairing approval on every connect(). WC v2 keeps approved
16
+ * sessions in the SignClient's storage (IndexedDB) for their full ~7-day TTL;
17
+ * with this off (the default) UWC ignores them and always re-pairs — the
18
+ * historical behaviour (MFS-642). When on, connect() first looks for a stored
19
+ * session whose namespaces cover the requested network and reuses it, skipping
20
+ * the QR/deep-link round-trip; it falls back to a fresh pairing when none is
21
+ * usable. Default false so existing consumers are byte-for-byte unaffected and
22
+ * the blast radius is opt-in per consumer.
23
+ *
24
+ * The SignClient (and its storage) lives in the SAME context that runs this
25
+ * connector — for Mesh Link that is the web.meshconnect.com iframe, whose
26
+ * per-origin IndexedDB survives the iframe being torn down and re-created — so
27
+ * reuse works in the production iframe without any bridge round-trip.
28
+ */
29
+ enableSessionReuse?: boolean;
30
+ /**
31
+ * Fired once when connect() resolves from a reused stored session instead of a
32
+ * fresh pairing handshake. Intended for a single telemetry tag (e.g.
33
+ * restored: true). Optional — omitting it keeps reuse working, only the signal
34
+ * is dropped. No-op unless enableSessionReuse is on. Mirrors
35
+ * TonConnectConfig.onSessionRestored.
36
+ */
37
+ onSessionRestored?: () => void;
38
+ /**
39
+ * Fired when reuse was attempted (enableSessionReuse on + wallet known) but fell
40
+ * back to a fresh pairing. Carries the coarse `reason` plus, for the ping
41
+ * outcomes, the ping round-trip (`pingMs`). The counterpart to onSessionRestored:
42
+ * together they give a reuse-outcome funnel (reused vs the reason it wasn't) for
43
+ * monitoring. Telemetry-only; never affects behaviour. No-op unless
44
+ * enableSessionReuse is on.
45
+ */
46
+ onSessionReuseSkipped?: (skip: WalletConnectSessionReuseSkip) => void;
47
+ /**
48
+ * Opt-in liveness-ping window (ms) for session reuse. Reuse is OPTIMISTIC by
49
+ * default: when this is unset (or ≤ 0) connect() adopts a stored session with no
50
+ * blocking probe — matching WC's own restore and every mainstream dApp connector
51
+ * — and a dead peer surfaces at the first sign (bounded by the app's signing
52
+ * escape hatch), not by making every relaunch wait. Set a positive number only if
53
+ * you would rather pay an up-front ping and re-pair immediately than risk a late
54
+ * failure; a too-tight bound will discard live-but-slow mobile peers (they often
55
+ * need > 4s to ack over the relay), so calibrate against the `pingMs` carried by
56
+ * onSessionReuseSkipped. Exposed as config so this bound can be tuned per consumer
57
+ * without a new UWC release. No-op unless enableSessionReuse is on.
58
+ */
59
+ sessionReusePingTimeoutMs?: number;
12
60
  }
13
61
  //# sourceMappingURL=wallet-connect-connector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wallet-connect-connector.d.ts","sourceRoot":"","sources":["../src/wallet-connect-connector.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,MAAM,CAAA;QACZ,WAAW,EAAE,MAAM,CAAA;QACnB,GAAG,EAAE,MAAM,CAAA;QACX,KAAK,EAAE,MAAM,EAAE,CAAA;KAChB,CAAA;CACF"}
1
+ {"version":3,"file":"wallet-connect-connector.d.ts","sourceRoot":"","sources":["../src/wallet-connect-connector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAA;AAEpE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,MAAM,CAAA;QACZ,WAAW,EAAE,MAAM,CAAA;QACnB,GAAG,EAAE,MAAM,CAAA;QACX,KAAK,EAAE,MAAM,EAAE,CAAA;KAChB,CAAA;IACD;;;;;;;;;;;;;;;OAeG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC9B;;;;;;;OAOG;IACH,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,6BAA6B,KAAK,IAAI,CAAA;IACrE;;;;;;;;;;;OAWG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAA;CACnC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meshconnect/uwc-types",
3
- "version": "0.19.0",
3
+ "version": "0.20.0-snapshot.3bf4b70",
4
4
  "description": "TypeScript types for Universal Wallet Connector",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/src/connector.ts CHANGED
@@ -56,6 +56,12 @@ export interface ConnectorResult {
56
56
  address: string
57
57
  availableAddresses: AvailableAddress[]
58
58
  publicKey?: string
59
+ /**
60
+ * True when the connector satisfied this connect() by adopting a live stored
61
+ * session instead of a fresh pairing (WalletConnect session reuse, MFS-642).
62
+ * Propagated onto the Session for observability. Absent = fresh connect.
63
+ */
64
+ reused?: boolean
59
65
  }
60
66
 
61
67
  /**
@@ -67,6 +73,22 @@ export interface SwitchNetworkResult {
67
73
  availableAddresses?: AvailableAddress[]
68
74
  }
69
75
 
76
+ /**
77
+ * Optional per-call hints for connect(). Additive and connector-agnostic —
78
+ * connectors that do not use a field simply ignore it.
79
+ */
80
+ export interface ConnectOptions {
81
+ /**
82
+ * Display name of the wallet the user selected (from the catalog). The
83
+ * WalletConnect connector keys its session-reuse record on this trusted name:
84
+ * it only ever re-adopts a session it previously recorded for the same selected
85
+ * wallet, never one established by another (possibly rogue) peer. Ignored by
86
+ * connectors without session reuse; absence disables reuse (fresh pairing is
87
+ * always safe).
88
+ */
89
+ walletName?: string
90
+ }
91
+
70
92
  /**
71
93
  * Common interface for all wallet connectors
72
94
  */
@@ -84,7 +106,8 @@ export interface Connector {
84
106
  | ExtensionInjectedProvider
85
107
  | IntegratedBrowserInjectedProvider
86
108
  | WalletConnectProvider
87
- | TonConnectWalletProvider
109
+ | TonConnectWalletProvider,
110
+ options?: ConnectOptions
88
111
  ): Promise<ConnectorResult>
89
112
 
90
113
  /**
@@ -97,6 +120,21 @@ export interface Connector {
97
120
  */
98
121
  getConnectionURI?(): string
99
122
 
123
+ /**
124
+ * Pre-generate a connection pairing (URI) ahead of wallet selection, WITHOUT
125
+ * waiting for approval. Warms the transport (e.g. opens the WalletConnect relay
126
+ * socket on a cold client) and returns a URI the caller can deep-link inside a
127
+ * user gesture; a subsequent `connect()` adopts the same pairing so the URI the
128
+ * user approves matches the one opened. Optional — only connectors with a
129
+ * pairing step (WalletConnect) implement it.
130
+ * @param provider Only `supportedNetworkIds` is required (pass the UNION of the
131
+ * session's WalletConnect wallets' networks so one pairing serves any wallet).
132
+ * @returns The pairing URI.
133
+ */
134
+ beginPairing?(
135
+ provider: Pick<WalletConnectProvider, 'supportedNetworkIds'>
136
+ ): Promise<string>
137
+
100
138
  /**
101
139
  * Disconnect from the wallet
102
140
  * This method is optional and may not be implemented by all connectors.
@@ -13,6 +13,46 @@
13
13
 
14
14
  export type LogLevel = 'debug' | 'info' | 'warn' | 'error'
15
15
 
16
+ /**
17
+ * Why an opt-in WalletConnect session-reuse attempt fell back to a fresh pairing
18
+ * instead of adopting a stored session (MFS-642). Small, stable enum so it can
19
+ * drive a reuse-outcome dashboard without high cardinality. Emitted via
20
+ * `WalletConnectConfig.onSessionReuseSkipped`.
21
+ *
22
+ * - `no_record` — no topic recorded for the selected wallet (e.g. first connect),
23
+ * or the recorded session is no longer in storage.
24
+ * - `expired` — the recorded session exists but is past its expiry.
25
+ * - `no_address` — the session carries no account for the requested network.
26
+ * - `ping_timeout`— the liveness ping got NO ack within the bounded window (peer
27
+ * slow/suspended or the relay socket is dead — CARE-263). Split
28
+ * from `ping_error` so a slow-but-alive mobile wallet (which
29
+ * would defeat reuse if the window is too tight) is measurable
30
+ * separately from a hard failure.
31
+ * - `ping_error` — the ping REJECTED (offline / relay / protocol error), i.e. an
32
+ * unknown liveness state rather than a confirmed no-ack.
33
+ * - `superseded` — a disconnect()/newer connect() invalidated the attempt mid-ping.
34
+ */
35
+ export type WalletConnectSessionReuseSkipReason =
36
+ | 'no_record'
37
+ | 'expired'
38
+ | 'no_address'
39
+ | 'ping_timeout'
40
+ | 'ping_error'
41
+ | 'superseded'
42
+
43
+ /**
44
+ * Payload for `WalletConnectConfig.onSessionReuseSkipped`. Carries the coarse
45
+ * reason plus, for the two ping outcomes, the ping round-trip in ms — so a
46
+ * consumer can chart the ping-latency distribution and decide whether the bound
47
+ * is clipping live-but-slow wallets. (The healthy-ping latency is separately
48
+ * observable as the reused connect's own handoff duration.)
49
+ */
50
+ export interface WalletConnectSessionReuseSkip {
51
+ reason: WalletConnectSessionReuseSkipReason
52
+ /** Ping round-trip in ms; present only for `ping_timeout` / `ping_error`. */
53
+ pingMs?: number
54
+ }
55
+
16
56
  /**
17
57
  * Pluggable logger. The default implementation (`createLogger`) is console-backed
18
58
  * and level-gated; inject your own to redirect UWC's internal logging into your
package/src/session.ts CHANGED
@@ -18,4 +18,13 @@ export interface Session {
18
18
  availableNetworks: Network[]
19
19
  activeWallet: WalletMetadata | null
20
20
  availableAddresses: AvailableAddress[]
21
+ /**
22
+ * Connection provenance: true when this session was adopted from a live stored
23
+ * WalletConnect session (MFS-642 reuse) rather than established by a fresh
24
+ * pairing handshake. Drives observability — it rides the `connected` telemetry
25
+ * and every subsequent operation handoff so success/error/timeout of reused
26
+ * sessions can be evaluated and triaged separately from fresh ones. Absent/false
27
+ * for fresh pairings and all non-WalletConnect connections.
28
+ */
29
+ reused?: boolean
21
30
  }
@@ -1,3 +1,5 @@
1
+ import type { WalletConnectSessionReuseSkip } from './observability'
2
+
1
3
  /**
2
4
  * Configuration for WalletConnect connector
3
5
  */
@@ -9,4 +11,51 @@ export interface WalletConnectConfig {
9
11
  url: string
10
12
  icons: string[]
11
13
  }
14
+ /**
15
+ * Opt-in: reuse a live WalletConnect session persisted in storage instead of
16
+ * forcing a fresh pairing approval on every connect(). WC v2 keeps approved
17
+ * sessions in the SignClient's storage (IndexedDB) for their full ~7-day TTL;
18
+ * with this off (the default) UWC ignores them and always re-pairs — the
19
+ * historical behaviour (MFS-642). When on, connect() first looks for a stored
20
+ * session whose namespaces cover the requested network and reuses it, skipping
21
+ * the QR/deep-link round-trip; it falls back to a fresh pairing when none is
22
+ * usable. Default false so existing consumers are byte-for-byte unaffected and
23
+ * the blast radius is opt-in per consumer.
24
+ *
25
+ * The SignClient (and its storage) lives in the SAME context that runs this
26
+ * connector — for Mesh Link that is the web.meshconnect.com iframe, whose
27
+ * per-origin IndexedDB survives the iframe being torn down and re-created — so
28
+ * reuse works in the production iframe without any bridge round-trip.
29
+ */
30
+ enableSessionReuse?: boolean
31
+ /**
32
+ * Fired once when connect() resolves from a reused stored session instead of a
33
+ * fresh pairing handshake. Intended for a single telemetry tag (e.g.
34
+ * restored: true). Optional — omitting it keeps reuse working, only the signal
35
+ * is dropped. No-op unless enableSessionReuse is on. Mirrors
36
+ * TonConnectConfig.onSessionRestored.
37
+ */
38
+ onSessionRestored?: () => void
39
+ /**
40
+ * Fired when reuse was attempted (enableSessionReuse on + wallet known) but fell
41
+ * back to a fresh pairing. Carries the coarse `reason` plus, for the ping
42
+ * outcomes, the ping round-trip (`pingMs`). The counterpart to onSessionRestored:
43
+ * together they give a reuse-outcome funnel (reused vs the reason it wasn't) for
44
+ * monitoring. Telemetry-only; never affects behaviour. No-op unless
45
+ * enableSessionReuse is on.
46
+ */
47
+ onSessionReuseSkipped?: (skip: WalletConnectSessionReuseSkip) => void
48
+ /**
49
+ * Opt-in liveness-ping window (ms) for session reuse. Reuse is OPTIMISTIC by
50
+ * default: when this is unset (or ≤ 0) connect() adopts a stored session with no
51
+ * blocking probe — matching WC's own restore and every mainstream dApp connector
52
+ * — and a dead peer surfaces at the first sign (bounded by the app's signing
53
+ * escape hatch), not by making every relaunch wait. Set a positive number only if
54
+ * you would rather pay an up-front ping and re-pair immediately than risk a late
55
+ * failure; a too-tight bound will discard live-but-slow mobile peers (they often
56
+ * need > 4s to ack over the relay), so calibrate against the `pingMs` carried by
57
+ * onSessionReuseSkipped. Exposed as config so this bound can be tuned per consumer
58
+ * without a new UWC release. No-op unless enableSessionReuse is on.
59
+ */
60
+ sessionReusePingTimeoutMs?: number
12
61
  }