@meshconnect/uwc-ton-connector 0.5.5 → 0.6.0
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/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/namespaced-storage.d.ts +0 -7
- package/dist/namespaced-storage.d.ts.map +1 -1
- package/dist/namespaced-storage.js +13 -11
- package/dist/namespaced-storage.js.map +1 -1
- package/dist/ton-connect-connector.d.ts +0 -1
- package/dist/ton-connect-connector.d.ts.map +1 -1
- package/dist/ton-connect-connector.js +48 -43
- package/dist/ton-connect-connector.js.map +1 -1
- package/dist/ton-connect-injected-restore.d.ts +40 -0
- package/dist/ton-connect-injected-restore.d.ts.map +1 -0
- package/dist/ton-connect-injected-restore.js +65 -0
- package/dist/ton-connect-injected-restore.js.map +1 -0
- package/dist/ton-connect-session-restore.d.ts +88 -0
- package/dist/ton-connect-session-restore.d.ts.map +1 -0
- package/dist/ton-connect-session-restore.js +219 -0
- package/dist/ton-connect-session-restore.js.map +1 -0
- package/package.json +3 -3
- package/src/index.ts +8 -0
- package/src/namespaced-storage.test.ts +13 -1
- package/src/namespaced-storage.ts +15 -12
- package/src/ton-connect-connector.test.ts +422 -7
- package/src/ton-connect-connector.ts +69 -61
- package/src/ton-connect-injected-restore.test.ts +340 -0
- package/src/ton-connect-injected-restore.ts +101 -0
- package/src/ton-connect-session-restore.test.ts +532 -0
- package/src/ton-connect-session-restore.ts +299 -0
package/dist/index.d.ts
CHANGED
|
@@ -3,4 +3,6 @@ export { isValidBase64 } from './validation';
|
|
|
3
3
|
export { buildTonTransactionRequest, buildSignDataPayload, executeSignData, unwrapBoc, bocToHash, toFriendlyAddress } from './ton-transaction-utils';
|
|
4
4
|
export { buildJettonTransferPayload, buildTonNativeRequestFromJettonTransfer } from './jetton-transfer';
|
|
5
5
|
export { TonConnectConnector } from './ton-connect-connector';
|
|
6
|
+
export { WALLET_RESPONSE_TIMEOUT_MS, withWalletResponseTimeout } from './ton-connect-session-restore';
|
|
7
|
+
export { TON_CONNECT_INJECTED_STORAGE_PREFIX, tryRestoreInjectedSession } from './ton-connect-injected-restore';
|
|
6
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,eAAe,EACf,SAAS,EACT,SAAS,EACT,iBAAiB,EAClB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,0BAA0B,EAC1B,uCAAuC,EACxC,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,eAAe,EACf,SAAS,EACT,SAAS,EACT,iBAAiB,EAClB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,0BAA0B,EAC1B,uCAAuC,EACxC,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,+BAA+B,CAAA;AACtC,OAAO,EACL,mCAAmC,EACnC,yBAAyB,EAC1B,MAAM,gCAAgC,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -3,4 +3,6 @@ export { isValidBase64 } from './validation';
|
|
|
3
3
|
export { buildTonTransactionRequest, buildSignDataPayload, executeSignData, unwrapBoc, bocToHash, toFriendlyAddress } from './ton-transaction-utils';
|
|
4
4
|
export { buildJettonTransferPayload, buildTonNativeRequestFromJettonTransfer } from './jetton-transfer';
|
|
5
5
|
export { TonConnectConnector } from './ton-connect-connector';
|
|
6
|
+
export { WALLET_RESPONSE_TIMEOUT_MS, withWalletResponseTimeout } from './ton-connect-session-restore';
|
|
7
|
+
export { TON_CONNECT_INJECTED_STORAGE_PREFIX, tryRestoreInjectedSession } from './ton-connect-injected-restore';
|
|
6
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,eAAe,EACf,SAAS,EACT,SAAS,EACT,iBAAiB,EAClB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,0BAA0B,EAC1B,uCAAuC,EACxC,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,eAAe,EACf,SAAS,EACT,SAAS,EACT,iBAAiB,EAClB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,0BAA0B,EAC1B,uCAAuC,EACxC,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,+BAA+B,CAAA;AACtC,OAAO,EACL,mCAAmC,EACnC,yBAAyB,EAC1B,MAAM,gCAAgC,CAAA"}
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
import type { IStorage } from '@tonconnect/sdk';
|
|
2
|
-
/**
|
|
3
|
-
* Prefixed localStorage wrapper required by @tonconnect/sdk.
|
|
4
|
-
* The SDK requires the dApp to provide storage for persisting connection state across reloads.
|
|
5
|
-
* Keys are prefixed per wallet (e.g. "tonkeeper:session") to avoid collisions.
|
|
6
|
-
* Falls back to in-memory Map when localStorage is blocked (Safari ITP in iframes).
|
|
7
|
-
*/
|
|
8
2
|
export declare class NamespacedStorage implements IStorage {
|
|
9
3
|
private prefix;
|
|
10
|
-
private memoryFallback;
|
|
11
4
|
constructor(prefix: string);
|
|
12
5
|
setItem(key: string, value: string): Promise<void>;
|
|
13
6
|
getItem(key: string): Promise<string | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namespaced-storage.d.ts","sourceRoot":"","sources":["../src/namespaced-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"namespaced-storage.d.ts","sourceRoot":"","sources":["../src/namespaced-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAa/C,qBAAa,iBAAkB,YAAW,QAAQ;IACpC,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE5B,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAW5C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5C,OAAO,CAAC,QAAQ;CAGjB"}
|
|
@@ -1,48 +1,50 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Prefixed localStorage wrapper
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Falls back to in-memory Map when localStorage is blocked (Safari ITP in iframes).
|
|
2
|
+
* Prefixed `localStorage` wrapper for @tonconnect/sdk's `IStorage`. Namespaces
|
|
3
|
+
* keys by prefix to avoid collisions, and falls back to an in-memory map when
|
|
4
|
+
* localStorage is blocked (e.g. Safari ITP in iframes).
|
|
6
5
|
*/
|
|
6
|
+
// Shared across instances so a fallback write is visible to a sibling instance
|
|
7
|
+
// — matching real localStorage (global). Keys are already prefix-namespaced,
|
|
8
|
+
// so a single map is collision-free.
|
|
9
|
+
const memoryFallback = new Map();
|
|
7
10
|
export class NamespacedStorage {
|
|
8
11
|
prefix;
|
|
9
|
-
memoryFallback = new Map();
|
|
10
12
|
constructor(prefix) {
|
|
11
13
|
this.prefix = prefix;
|
|
12
14
|
}
|
|
13
15
|
async setItem(key, value) {
|
|
14
16
|
if (typeof localStorage === 'undefined') {
|
|
15
|
-
|
|
17
|
+
memoryFallback.set(this.prefixed(key), value);
|
|
16
18
|
return;
|
|
17
19
|
}
|
|
18
20
|
try {
|
|
19
21
|
localStorage.setItem(this.prefixed(key), value);
|
|
20
22
|
}
|
|
21
23
|
catch {
|
|
22
|
-
|
|
24
|
+
memoryFallback.set(this.prefixed(key), value);
|
|
23
25
|
}
|
|
24
26
|
}
|
|
25
27
|
async getItem(key) {
|
|
26
28
|
if (typeof localStorage === 'undefined') {
|
|
27
|
-
return
|
|
29
|
+
return memoryFallback.get(this.prefixed(key)) ?? null;
|
|
28
30
|
}
|
|
29
31
|
try {
|
|
30
32
|
return localStorage.getItem(this.prefixed(key));
|
|
31
33
|
}
|
|
32
34
|
catch {
|
|
33
|
-
return
|
|
35
|
+
return memoryFallback.get(this.prefixed(key)) ?? null;
|
|
34
36
|
}
|
|
35
37
|
}
|
|
36
38
|
async removeItem(key) {
|
|
37
39
|
if (typeof localStorage === 'undefined') {
|
|
38
|
-
|
|
40
|
+
memoryFallback.delete(this.prefixed(key));
|
|
39
41
|
return;
|
|
40
42
|
}
|
|
41
43
|
try {
|
|
42
44
|
localStorage.removeItem(this.prefixed(key));
|
|
43
45
|
}
|
|
44
46
|
catch {
|
|
45
|
-
|
|
47
|
+
memoryFallback.delete(this.prefixed(key));
|
|
46
48
|
}
|
|
47
49
|
}
|
|
48
50
|
prefixed(key) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namespaced-storage.js","sourceRoot":"","sources":["../src/namespaced-storage.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"namespaced-storage.js","sourceRoot":"","sources":["../src/namespaced-storage.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,+EAA+E;AAC/E,6EAA6E;AAC7E,qCAAqC;AACrC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAA;AAEhD,MAAM,OAAO,iBAAiB;IACR;IAApB,YAAoB,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAEtC,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,KAAa;QACtC,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;YACxC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAA;YAC7C,OAAM;QACR,CAAC;QACD,IAAI,CAAC;YACH,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAA;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAA;QAC/C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW;QACvB,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;YACxC,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAA;QACvD,CAAC;QACD,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAA;QACvD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAW;QAC1B,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;YACxC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;YACzC,OAAM;QACR,CAAC;QACD,IAAI,CAAC;YACH,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,GAAW;QAC1B,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,EAAE,CAAA;IAChC,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ton-connect-connector.d.ts","sourceRoot":"","sources":["../src/ton-connect-connector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EAExB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,
|
|
1
|
+
{"version":3,"file":"ton-connect-connector.d.ts","sourceRoot":"","sources":["../src/ton-connect-connector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EAExB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EAEd,MAAM,wBAAwB,CAAA;AAkC/B,qBAAa,mBAAoB,YAAW,SAAS;IACnD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,GAAG,CAA2B;IACtC,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,kBAAkB,CAAyB;IACnD,OAAO,CAAC,cAAc,CAA6C;IACnE,OAAO,CAAC,uBAAuB,CAEhB;IACf,OAAO,CAAC,qBAAqB,CAAiD;IAC9E,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,mBAAmB,CAA4B;IACvD,OAAO,CAAC,qBAAqB,CAAwC;IACrE,OAAO,CAAC,iBAAiB,CAAI;gBAEjB,MAAM,EAAE,gBAAgB;IAIpC,oEAAoE;IAC9D,OAAO,CACX,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,wBAAwB,GAClC,OAAO,CAAC,eAAe,CAAC;YA6Bb,cAAc;IAqG5B,sEAAsE;IACtE,gBAAgB,IAAI,MAAM;IAO1B,iDAAiD;IAC3C,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAyB1D,uDAAuD;IACjD,eAAe,CACnB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC;IA8B7B,qEAAqE;IAC/D,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAOnE,yDAAyD;IACnD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBjC,4DAA4D;IACtD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAIhB,qBAAqB;IAuEnC,OAAO,CAAC,sBAAsB;YAWhB,UAAU;IAWxB,OAAO,CAAC,mBAAmB;CAM5B"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { WalletConnectorError } from '@meshconnect/uwc-types';
|
|
2
2
|
import { NamespacedStorage } from './namespaced-storage';
|
|
3
|
-
import { buildTonTransactionRequest, buildSignDataPayload, executeSignData, unwrapBoc, bocToHash
|
|
4
|
-
|
|
5
|
-
// has no built-in timeout
|
|
3
|
+
import { buildTonTransactionRequest, buildSignDataPayload, executeSignData, unwrapBoc, bocToHash } from './ton-transaction-utils';
|
|
4
|
+
import { TON_CONNECT_STORAGE_PREFIX, buildConnectorResult, connectionCancelledError, tryRestoreSession, withWalletResponseTimeout } from './ton-connect-session-restore';
|
|
5
|
+
// TonConnect has no built-in connect timeout; bound the pending handshake so
|
|
6
|
+
// it can't hang indefinitely.
|
|
6
7
|
const CONNECT_TIMEOUT_MS = 5 * 60 * 1000;
|
|
7
8
|
export class TonConnectConnector {
|
|
8
9
|
config;
|
|
@@ -45,7 +46,7 @@ export class TonConnectConnector {
|
|
|
45
46
|
try {
|
|
46
47
|
const { TonConnect, toUserFriendlyAddress, UserRejectsError } = await import('@tonconnect/sdk');
|
|
47
48
|
if (this.connectGeneration !== generation) {
|
|
48
|
-
throw
|
|
49
|
+
throw connectionCancelledError();
|
|
49
50
|
}
|
|
50
51
|
this.toUserFriendlyAddressFn = toUserFriendlyAddress;
|
|
51
52
|
this.UserRejectsErrorClass = UserRejectsError;
|
|
@@ -53,7 +54,7 @@ export class TonConnectConnector {
|
|
|
53
54
|
? this.config.manifestUrl()
|
|
54
55
|
: this.config.manifestUrl;
|
|
55
56
|
const sdkOptions = {
|
|
56
|
-
storage: new NamespacedStorage(
|
|
57
|
+
storage: new NamespacedStorage(TON_CONNECT_STORAGE_PREFIX),
|
|
57
58
|
manifestUrl: resolvedManifestUrl,
|
|
58
59
|
analytics: { mode: 'off' }
|
|
59
60
|
};
|
|
@@ -61,45 +62,51 @@ export class TonConnectConnector {
|
|
|
61
62
|
sdkOptions.walletsListSource = this.config.walletsListSource;
|
|
62
63
|
}
|
|
63
64
|
this.sdk = new TonConnect(sdkOptions);
|
|
64
|
-
// ONC-2717: The SDK supports restoreConnection() to resume a previous
|
|
65
|
-
// session from NamespacedStorage without a new QR scan. Currently we
|
|
66
|
-
// always start fresh (disconnect stale sessions below). Adding session
|
|
67
|
-
// resumption would let users stay connected across page reloads —
|
|
68
|
-
// call sdk.restoreConnection() here and skip the QR flow if it succeeds.
|
|
69
|
-
if (this.sdk.connected) {
|
|
70
|
-
// Can't reuse: the SDK binds one provider (JS or HTTP bridge) per instance.
|
|
71
|
-
// A stale HTTP session from a previous wallet would corrupt the new one.
|
|
72
|
-
try {
|
|
73
|
-
await this.sdk.disconnect();
|
|
74
|
-
}
|
|
75
|
-
catch {
|
|
76
|
-
/* best effort — clear stale session from NamespacedStorage */
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
65
|
const sdkRef = this.sdk;
|
|
66
|
+
// Outer connect() validates this is non-empty; narrow for the rest of executeConnect.
|
|
67
|
+
const walletAppName = provider.walletListAppName;
|
|
68
|
+
if (!walletAppName) {
|
|
69
|
+
throw new Error('TonConnectWalletProvider.walletListAppName is required');
|
|
70
|
+
}
|
|
71
|
+
const restored = await tryRestoreSession({
|
|
72
|
+
network,
|
|
73
|
+
provider,
|
|
74
|
+
requestedAppName: walletAppName,
|
|
75
|
+
sdk: sdkRef,
|
|
76
|
+
generation
|
|
77
|
+
}, {
|
|
78
|
+
getCurrentGeneration: () => this.connectGeneration,
|
|
79
|
+
setAbortHook: fn => {
|
|
80
|
+
this.abortPendingConnect = fn;
|
|
81
|
+
},
|
|
82
|
+
toUserFriendlyAddressFn: this.toUserFriendlyAddressFn,
|
|
83
|
+
...(this.config.onSessionRestored
|
|
84
|
+
? { onSessionRestored: this.config.onSessionRestored }
|
|
85
|
+
: {})
|
|
86
|
+
});
|
|
87
|
+
if (restored) {
|
|
88
|
+
this.connectedAddress = restored.address;
|
|
89
|
+
this.connectedNetworkId = network.id;
|
|
90
|
+
return restored;
|
|
91
|
+
}
|
|
80
92
|
// Resolve bridge URLs from the SDK's wallet list (built-in or custom walletsListSource)
|
|
81
93
|
const wallets = await sdkRef.getWallets();
|
|
82
94
|
const remoteWallets = wallets.filter((w) => 'bridgeUrl' in w && 'universalLink' in w);
|
|
83
|
-
const walletInfo = remoteWallets.find(w => w.appName ===
|
|
95
|
+
const walletInfo = remoteWallets.find(w => w.appName === walletAppName);
|
|
84
96
|
if (!walletInfo) {
|
|
85
|
-
throw new Error(`Wallet '${
|
|
97
|
+
throw new Error(`Wallet '${walletAppName}' not found in TonConnect wallet list, or missing bridge/universalLink`);
|
|
86
98
|
}
|
|
87
99
|
const walletResult = await this.waitForWalletApproval(sdkRef, walletInfo.universalLink, walletInfo.bridgeUrl);
|
|
88
100
|
this.connectionURI = undefined; // URI consumed — clear before notify fires
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
101
|
+
const result = buildConnectorResult({
|
|
102
|
+
account: walletResult,
|
|
103
|
+
network,
|
|
104
|
+
provider,
|
|
105
|
+
toUserFriendlyAddressFn: this.toUserFriendlyAddressFn
|
|
106
|
+
});
|
|
107
|
+
this.connectedAddress = result.address;
|
|
93
108
|
this.connectedNetworkId = network.id;
|
|
94
|
-
|
|
95
|
-
return {
|
|
96
|
-
networkId: network.id,
|
|
97
|
-
address: friendlyAddress,
|
|
98
|
-
...(walletResult.publicKey
|
|
99
|
-
? { publicKey: walletResult.publicKey }
|
|
100
|
-
: {}),
|
|
101
|
-
availableAddresses
|
|
102
|
-
};
|
|
109
|
+
return result;
|
|
103
110
|
}
|
|
104
111
|
finally {
|
|
105
112
|
if (this.connectGeneration === generation) {
|
|
@@ -122,7 +129,7 @@ export class TonConnectConnector {
|
|
|
122
129
|
}
|
|
123
130
|
const payload = buildSignDataPayload(message);
|
|
124
131
|
try {
|
|
125
|
-
return await executeSignData(this.sdk, payload);
|
|
132
|
+
return await withWalletResponseTimeout(executeSignData(this.sdk, payload), TON_CONNECT_STORAGE_PREFIX);
|
|
126
133
|
}
|
|
127
134
|
catch (error) {
|
|
128
135
|
if (this.UserRejectsErrorClass &&
|
|
@@ -144,7 +151,7 @@ export class TonConnectConnector {
|
|
|
144
151
|
const senderRawAddress = this.sdk.account?.address;
|
|
145
152
|
const txRequest = buildTonTransactionRequest(tonRequest, senderRawAddress);
|
|
146
153
|
try {
|
|
147
|
-
const result = await this.sdk.sendTransaction(txRequest);
|
|
154
|
+
const result = await withWalletResponseTimeout(this.sdk.sendTransaction(txRequest), TON_CONNECT_STORAGE_PREFIX);
|
|
148
155
|
const boc = unwrapBoc(result);
|
|
149
156
|
return bocToHash(boc);
|
|
150
157
|
}
|
|
@@ -168,6 +175,9 @@ export class TonConnectConnector {
|
|
|
168
175
|
}
|
|
169
176
|
/** Disconnect from the wallet and clean up resources. */
|
|
170
177
|
async disconnect() {
|
|
178
|
+
// Advancing the generation cancels an in-flight restore still parked in its
|
|
179
|
+
// pre-hook storage read, where the abort hook isn't registered yet.
|
|
180
|
+
this.connectGeneration++;
|
|
171
181
|
this.abortPendingConnect?.();
|
|
172
182
|
this.abortPendingConnect = null;
|
|
173
183
|
this.pendingConnectPromise = null;
|
|
@@ -206,7 +216,7 @@ export class TonConnectConnector {
|
|
|
206
216
|
settled = true;
|
|
207
217
|
this.clearConnectTimeout();
|
|
208
218
|
unsubscribe?.();
|
|
209
|
-
reject(
|
|
219
|
+
reject(connectionCancelledError());
|
|
210
220
|
};
|
|
211
221
|
this.connectTimeout = setTimeout(() => {
|
|
212
222
|
if (settled)
|
|
@@ -277,10 +287,5 @@ export class TonConnectConnector {
|
|
|
277
287
|
this.connectTimeout = null;
|
|
278
288
|
}
|
|
279
289
|
}
|
|
280
|
-
buildAvailableAddresses(supportedNetworkIds, address) {
|
|
281
|
-
return supportedNetworkIds
|
|
282
|
-
.filter(id => id.startsWith('tvm:'))
|
|
283
|
-
.map(networkId => ({ address, networkId: networkId }));
|
|
284
|
-
}
|
|
285
290
|
}
|
|
286
291
|
//# sourceMappingURL=ton-connect-connector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ton-connect-connector.js","sourceRoot":"","sources":["../src/ton-connect-connector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ton-connect-connector.js","sourceRoot":"","sources":["../src/ton-connect-connector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ITonConnect } from '@tonconnect/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Injected (JS Bridge) restore preflight behind `TonWalletService`.
|
|
4
|
+
* Mirrors the HTTP path in `ton-connect-session-restore.ts` and shares its
|
|
5
|
+
* account-extraction; only the storage prefix and match criterion differ.
|
|
6
|
+
*/
|
|
7
|
+
export declare const TON_CONNECT_INJECTED_STORAGE_PREFIX = "uwc-ton-injected";
|
|
8
|
+
/**
|
|
9
|
+
* Return the stored session's jsBridgeKey if a usable injected session exists;
|
|
10
|
+
* null (→ fresh connect) for empty/malformed/non-injected entries.
|
|
11
|
+
*/
|
|
12
|
+
export declare function readStoredInjectedConnection(): Promise<{
|
|
13
|
+
jsBridgeKey: string;
|
|
14
|
+
} | null>;
|
|
15
|
+
export interface TryRestoreInjectedSessionArgs {
|
|
16
|
+
requestedJsBridgeKey: string;
|
|
17
|
+
sdk: ITonConnect;
|
|
18
|
+
generation: number;
|
|
19
|
+
}
|
|
20
|
+
export interface TryRestoreInjectedSessionDeps {
|
|
21
|
+
/** Current connectGeneration for cancellation detection. */
|
|
22
|
+
getCurrentGeneration: () => number;
|
|
23
|
+
/** Register/clear the abort hook on the host (TonWalletService). */
|
|
24
|
+
setAbortHook: (fn: (() => void) | null) => void;
|
|
25
|
+
/** SDK's `toUserFriendlyAddress`, captured by the host after dynamic import. */
|
|
26
|
+
toUserFriendlyAddressFn: ((hex: string, testOnly?: boolean) => string) | null;
|
|
27
|
+
/** Optional host telemetry callback fired exactly once on successful restore. */
|
|
28
|
+
onSessionRestored?: () => void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Resume an existing injected session before falling back to a fresh handshake.
|
|
32
|
+
* Returns null on any non-success path; throws the cancellation error if
|
|
33
|
+
* connectGeneration changes mid-flight. The wallet's injected restoreConnection
|
|
34
|
+
* is the source of truth — it re-issues the connect event or drops the session.
|
|
35
|
+
*/
|
|
36
|
+
export declare function tryRestoreInjectedSession(args: TryRestoreInjectedSessionArgs, deps: TryRestoreInjectedSessionDeps): Promise<{
|
|
37
|
+
address: string;
|
|
38
|
+
publicKey?: string;
|
|
39
|
+
} | null>;
|
|
40
|
+
//# sourceMappingURL=ton-connect-injected-restore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ton-connect-injected-restore.d.ts","sourceRoot":"","sources":["../src/ton-connect-injected-restore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAUlD;;;;GAIG;AAIH,eAAO,MAAM,mCAAmC,qBAAqB,CAAA;AASrE;;;GAGG;AACH,wBAAsB,4BAA4B,IAAI,OAAO,CAAC;IAC5D,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,IAAI,CAAC,CAcR;AAED,MAAM,WAAW,6BAA6B;IAC5C,oBAAoB,EAAE,MAAM,CAAA;IAC5B,GAAG,EAAE,WAAW,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,6BAA6B;IAC5C,4DAA4D;IAC5D,oBAAoB,EAAE,MAAM,MAAM,CAAA;IAClC,oEAAoE;IACpE,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,CAAA;IAC/C,gFAAgF;IAChF,uBAAuB,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC,GAAG,IAAI,CAAA;IAC7E,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;CAC/B;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,6BAA6B,EACnC,IAAI,EAAE,6BAA6B,GAClC,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAyBzD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { NamespacedStorage } from './namespaced-storage';
|
|
2
|
+
import { toFriendlyAddress } from './ton-transaction-utils';
|
|
3
|
+
import { TON_CONNECT_BRIDGE_CONNECTION_KEY, awaitRestoredAccount, clearStoredBridgeConnection, connectionCancelledError } from './ton-connect-session-restore';
|
|
4
|
+
/**
|
|
5
|
+
* Injected (JS Bridge) restore preflight behind `TonWalletService`.
|
|
6
|
+
* Mirrors the HTTP path in `ton-connect-session-restore.ts` and shares its
|
|
7
|
+
* account-extraction; only the storage prefix and match criterion differ.
|
|
8
|
+
*/
|
|
9
|
+
// Storage prefix for the injected TON path; must match the SDK constructor in
|
|
10
|
+
// ton-wallet-service.ts.
|
|
11
|
+
export const TON_CONNECT_INJECTED_STORAGE_PREFIX = 'uwc-ton-injected';
|
|
12
|
+
/**
|
|
13
|
+
* Return the stored session's jsBridgeKey if a usable injected session exists;
|
|
14
|
+
* null (→ fresh connect) for empty/malformed/non-injected entries.
|
|
15
|
+
*/
|
|
16
|
+
export async function readStoredInjectedConnection() {
|
|
17
|
+
try {
|
|
18
|
+
const storage = new NamespacedStorage(TON_CONNECT_INJECTED_STORAGE_PREFIX);
|
|
19
|
+
const raw = await storage.getItem(TON_CONNECT_BRIDGE_CONNECTION_KEY);
|
|
20
|
+
if (!raw)
|
|
21
|
+
return null;
|
|
22
|
+
const parsed = JSON.parse(raw);
|
|
23
|
+
if (parsed.type !== 'injected')
|
|
24
|
+
return null;
|
|
25
|
+
if (typeof parsed.jsBridgeKey !== 'string' || !parsed.jsBridgeKey) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
return { jsBridgeKey: parsed.jsBridgeKey };
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Resume an existing injected session before falling back to a fresh handshake.
|
|
36
|
+
* Returns null on any non-success path; throws the cancellation error if
|
|
37
|
+
* connectGeneration changes mid-flight. The wallet's injected restoreConnection
|
|
38
|
+
* is the source of truth — it re-issues the connect event or drops the session.
|
|
39
|
+
*/
|
|
40
|
+
export async function tryRestoreInjectedSession(args, deps) {
|
|
41
|
+
const { requestedJsBridgeKey, sdk, generation } = args;
|
|
42
|
+
const stored = await readStoredInjectedConnection();
|
|
43
|
+
if (deps.getCurrentGeneration() !== generation) {
|
|
44
|
+
throw connectionCancelledError();
|
|
45
|
+
}
|
|
46
|
+
if (!stored)
|
|
47
|
+
return null;
|
|
48
|
+
// JS bridge keys are JS property names on `window` (e.g. `tonkeeper`) —
|
|
49
|
+
// case-sensitive by definition. A mismatch means a different wallet was
|
|
50
|
+
// last connected; wipe the stale session and fall through.
|
|
51
|
+
if (stored.jsBridgeKey !== requestedJsBridgeKey) {
|
|
52
|
+
await clearStoredBridgeConnection(TON_CONNECT_INJECTED_STORAGE_PREFIX);
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
return awaitRestoredAccount(sdk, deps, generation, account => {
|
|
56
|
+
const friendlyAddress = deps.toUserFriendlyAddressFn
|
|
57
|
+
? toFriendlyAddress(account.address, deps.toUserFriendlyAddressFn)
|
|
58
|
+
: account.address;
|
|
59
|
+
return {
|
|
60
|
+
address: friendlyAddress,
|
|
61
|
+
...(account.publicKey ? { publicKey: account.publicKey } : {})
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=ton-connect-injected-restore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ton-connect-injected-restore.js","sourceRoot":"","sources":["../src/ton-connect-injected-restore.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EACL,iCAAiC,EACjC,oBAAoB,EACpB,2BAA2B,EAC3B,wBAAwB,EACzB,MAAM,+BAA+B,CAAA;AAEtC;;;;GAIG;AAEH,8EAA8E;AAC9E,yBAAyB;AACzB,MAAM,CAAC,MAAM,mCAAmC,GAAG,kBAAkB,CAAA;AASrE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B;IAGhD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,mCAAmC,CAAC,CAAA;QAC1E,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAA;QACpE,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAA;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA6B,CAAA;QAC1D,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO,IAAI,CAAA;QAC3C,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAClE,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAA;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAmBD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,IAAmC,EACnC,IAAmC;IAEnC,MAAM,EAAE,oBAAoB,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,IAAI,CAAA;IACtD,MAAM,MAAM,GAAG,MAAM,4BAA4B,EAAE,CAAA;IACnD,IAAI,IAAI,CAAC,oBAAoB,EAAE,KAAK,UAAU,EAAE,CAAC;QAC/C,MAAM,wBAAwB,EAAE,CAAA;IAClC,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAExB,wEAAwE;IACxE,wEAAwE;IACxE,2DAA2D;IAC3D,IAAI,MAAM,CAAC,WAAW,KAAK,oBAAoB,EAAE,CAAC;QAChD,MAAM,2BAA2B,CAAC,mCAAmC,CAAC,CAAA;QACtE,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE;QAC3D,MAAM,eAAe,GAAG,IAAI,CAAC,uBAAuB;YAClD,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,uBAAuB,CAAC;YAClE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAA;QACnB,OAAO;YACL,OAAO,EAAE,eAAe;YACxB,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/D,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { AvailableAddress, ConnectorResult, Network, TonConnectWalletProvider } from '@meshconnect/uwc-types';
|
|
2
|
+
import type { ITonConnect } from '@tonconnect/sdk';
|
|
3
|
+
/**
|
|
4
|
+
* Pure helpers + the shared restore orchestrator behind the TON restore
|
|
5
|
+
* preflight, split out of the connector so the storage read,
|
|
6
|
+
* wallet-shape guard, and result construction stay unit-testable.
|
|
7
|
+
*/
|
|
8
|
+
export declare const TON_CONNECT_STORAGE_PREFIX = "uwc-ton-remote";
|
|
9
|
+
export declare const TON_CONNECT_BRIDGE_CONNECTION_KEY = "ton-connect-storage_bridge-connection";
|
|
10
|
+
export declare const WALLET_RESPONSE_TIMEOUT_MS: number;
|
|
11
|
+
export declare function connectionCancelledError(): Error;
|
|
12
|
+
/**
|
|
13
|
+
* Wipe the SDK's stored bridge-connection blob for a prefix, on appName mismatch
|
|
14
|
+
* or a dead-session timeout. We remove the entry directly rather than via
|
|
15
|
+
* sdk.disconnect(), which throws on a freshly-built SDK (connected === false)
|
|
16
|
+
* and would leave the stale blob in place.
|
|
17
|
+
*/
|
|
18
|
+
export declare function clearStoredBridgeConnection(prefix: string): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Race a wallet round-trip against the deadline. On timeout, clear the stored
|
|
21
|
+
* session and reject with a recoverable `expired` error. The SDK promise stays
|
|
22
|
+
* parked; a late wallet reply resolves into a no-op.
|
|
23
|
+
*/
|
|
24
|
+
export declare function withWalletResponseTimeout<T>(operation: Promise<T>, prefix: string, timeoutMs?: number): Promise<T>;
|
|
25
|
+
/**
|
|
26
|
+
* Return the stored session's wallet appName if a usable HTTP session exists;
|
|
27
|
+
* null (→ fresh connect) for empty/malformed/pending/non-http entries.
|
|
28
|
+
*/
|
|
29
|
+
export declare function readStoredConnection(): Promise<{
|
|
30
|
+
appName: string;
|
|
31
|
+
} | null>;
|
|
32
|
+
/**
|
|
33
|
+
* Extract account address/publicKey from the unknown onStatusChange payload;
|
|
34
|
+
* null when disconnected or the shape mismatches.
|
|
35
|
+
*/
|
|
36
|
+
export declare function extractRestoredAccount(wallet: unknown): {
|
|
37
|
+
address: string;
|
|
38
|
+
publicKey?: string;
|
|
39
|
+
} | null;
|
|
40
|
+
/** Pair each TVM-namespace network id with the friendly address. */
|
|
41
|
+
export declare function buildAvailableAddresses(supportedNetworkIds: string[], address: string): AvailableAddress[];
|
|
42
|
+
/**
|
|
43
|
+
* Build the ConnectorResult for both the fresh-connect and restore paths.
|
|
44
|
+
* Pure; pass toUserFriendlyAddressFn=null to keep the raw hex address.
|
|
45
|
+
*/
|
|
46
|
+
export declare function buildConnectorResult(args: {
|
|
47
|
+
account: {
|
|
48
|
+
address: string;
|
|
49
|
+
publicKey?: string;
|
|
50
|
+
};
|
|
51
|
+
network: Network;
|
|
52
|
+
provider: TonConnectWalletProvider;
|
|
53
|
+
toUserFriendlyAddressFn: ((hex: string, testOnly?: boolean) => string) | null;
|
|
54
|
+
}): ConnectorResult;
|
|
55
|
+
export interface TryRestoreSessionArgs {
|
|
56
|
+
network: Network;
|
|
57
|
+
provider: TonConnectWalletProvider;
|
|
58
|
+
requestedAppName: string;
|
|
59
|
+
sdk: ITonConnect;
|
|
60
|
+
generation: number;
|
|
61
|
+
}
|
|
62
|
+
export interface TryRestoreSessionDeps {
|
|
63
|
+
/** Read-side: current connectGeneration for cancellation detection. */
|
|
64
|
+
getCurrentGeneration: () => number;
|
|
65
|
+
/** Write-side: register/clear the abort hook on the host (TonConnectConnector). */
|
|
66
|
+
setAbortHook: (fn: (() => void) | null) => void;
|
|
67
|
+
/** Optional host telemetry callback fired exactly once on successful restore. */
|
|
68
|
+
onSessionRestored?: () => void;
|
|
69
|
+
/** SDK's `toUserFriendlyAddress`, captured by the host after dynamic import. */
|
|
70
|
+
toUserFriendlyAddressFn: ((hex: string, testOnly?: boolean) => string) | null;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Shared restore orchestrator: subscribe to onStatusChange, register the abort
|
|
74
|
+
* hook, call sdk.restoreConnection(), then resolve buildResult(account) on a
|
|
75
|
+
* usable account — null if restore settles without one, reject if aborted.
|
|
76
|
+
* Only the resolve shape (buildResult) differs between HTTP and injected.
|
|
77
|
+
*/
|
|
78
|
+
export declare function awaitRestoredAccount<T>(sdk: ITonConnect, deps: Pick<TryRestoreSessionDeps, 'setAbortHook' | 'onSessionRestored' | 'getCurrentGeneration'>, generation: number, buildResult: (account: {
|
|
79
|
+
address: string;
|
|
80
|
+
publicKey?: string;
|
|
81
|
+
}) => T): Promise<T | null>;
|
|
82
|
+
/**
|
|
83
|
+
* Resume an existing HTTP-bridge session before falling back to a fresh
|
|
84
|
+
* handshake. Returns null on any non-success path; throws the cancellation
|
|
85
|
+
* error if connectGeneration changes mid-flight (caller surfaces it).
|
|
86
|
+
*/
|
|
87
|
+
export declare function tryRestoreSession(args: TryRestoreSessionArgs, deps: TryRestoreSessionDeps): Promise<ConnectorResult | null>;
|
|
88
|
+
//# sourceMappingURL=ton-connect-session-restore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ton-connect-session-restore.d.ts","sourceRoot":"","sources":["../src/ton-connect-session-restore.ts"],"names":[],"mappings":"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"}
|