@kheopskit/core 5.3.0 → 6.0.0-rc.1

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.
Files changed (83) hide show
  1. package/CHANGELOG.md +432 -0
  2. package/MIGRATING_TO_V6.md +840 -0
  3. package/README.md +629 -12
  4. package/dist/ethereum.d.mts +12 -6
  5. package/dist/ethereum.d.ts +12 -6
  6. package/dist/ethereum.js +13 -10
  7. package/dist/ethereum.js.map +1 -1
  8. package/dist/ethereum.mjs +7 -4
  9. package/dist/ethereum.mjs.map +1 -1
  10. package/dist/{iconCache-pP2ES4pJ.mjs → iconCache-C-U3IEbP.mjs} +21 -40
  11. package/dist/iconCache-C-U3IEbP.mjs.map +1 -0
  12. package/dist/{iconCache-DUtkJlaX.js → iconCache-FR4iy6go.js} +21 -40
  13. package/dist/iconCache-FR4iy6go.js.map +1 -0
  14. package/dist/index.d.mts +17 -63
  15. package/dist/index.d.ts +17 -63
  16. package/dist/index.js +387 -373
  17. package/dist/index.js.map +1 -1
  18. package/dist/index.mjs +384 -369
  19. package/dist/index.mjs.map +1 -1
  20. package/dist/injectedWallets-48L-AL1I.mjs +173 -0
  21. package/dist/injectedWallets-48L-AL1I.mjs.map +1 -0
  22. package/dist/injectedWallets-Dy8YGKL-.js +178 -0
  23. package/dist/injectedWallets-Dy8YGKL-.js.map +1 -0
  24. package/dist/internal.d.mts +3 -27
  25. package/dist/internal.d.ts +3 -27
  26. package/dist/internal.js +2 -2
  27. package/dist/internal.mjs +2 -2
  28. package/dist/pageLoad-BZ7o8p5R.mjs +24 -0
  29. package/dist/pageLoad-BZ7o8p5R.mjs.map +1 -0
  30. package/dist/pageLoad-D1wLeuFG.js +28 -0
  31. package/dist/pageLoad-D1wLeuFG.js.map +1 -0
  32. package/dist/platformAccounts-BjIeRcFN.js +321 -0
  33. package/dist/platformAccounts-BjIeRcFN.js.map +1 -0
  34. package/dist/platformAccounts-yyRUrnel.mjs +256 -0
  35. package/dist/platformAccounts-yyRUrnel.mjs.map +1 -0
  36. package/dist/polkadot.d.mts +127 -11
  37. package/dist/polkadot.d.ts +127 -11
  38. package/dist/polkadot.js +187 -106
  39. package/dist/polkadot.js.map +1 -1
  40. package/dist/polkadot.mjs +180 -99
  41. package/dist/polkadot.mjs.map +1 -1
  42. package/dist/solana.d.mts +11 -5
  43. package/dist/solana.d.ts +11 -5
  44. package/dist/solana.js +18 -15
  45. package/dist/solana.js.map +1 -1
  46. package/dist/solana.mjs +7 -4
  47. package/dist/solana.mjs.map +1 -1
  48. package/dist/storage-D3AwNgqc.d.mts +27 -0
  49. package/dist/storage-D3AwNgqc.d.ts +27 -0
  50. package/dist/testing.d.mts +71 -0
  51. package/dist/testing.d.ts +71 -0
  52. package/dist/testing.js +136 -0
  53. package/dist/testing.js.map +1 -0
  54. package/dist/testing.mjs +131 -0
  55. package/dist/testing.mjs.map +1 -0
  56. package/dist/{types-DKU-SNio.js → types-BWHvNFlN.js} +149 -2
  57. package/dist/types-BWHvNFlN.js.map +1 -0
  58. package/dist/types-Yor672md.mjs +215 -0
  59. package/dist/types-Yor672md.mjs.map +1 -0
  60. package/dist/types-lkMXVJNG.d.mts +685 -0
  61. package/dist/types-lkMXVJNG.d.ts +685 -0
  62. package/dist/walletconnect.d.mts +41 -0
  63. package/dist/walletconnect.d.ts +41 -0
  64. package/dist/walletconnect.js +219 -0
  65. package/dist/walletconnect.js.map +1 -0
  66. package/dist/walletconnect.mjs +216 -0
  67. package/dist/walletconnect.mjs.map +1 -0
  68. package/package.json +30 -6
  69. package/dist/errors-BLFP1dQI.mjs +0 -181
  70. package/dist/errors-BLFP1dQI.mjs.map +0 -1
  71. package/dist/errors-DYWVPHrR.js +0 -222
  72. package/dist/errors-DYWVPHrR.js.map +0 -1
  73. package/dist/iconCache-DUtkJlaX.js.map +0 -1
  74. package/dist/iconCache-pP2ES4pJ.mjs.map +0 -1
  75. package/dist/injectedWallets-BqR-_aAy.js +0 -148
  76. package/dist/injectedWallets-BqR-_aAy.js.map +0 -1
  77. package/dist/injectedWallets-Uz4hPuoW.mjs +0 -119
  78. package/dist/injectedWallets-Uz4hPuoW.mjs.map +0 -1
  79. package/dist/types-AxUDtkR-.d.mts +0 -338
  80. package/dist/types-AxUDtkR-.d.ts +0 -338
  81. package/dist/types-DKU-SNio.js.map +0 -1
  82. package/dist/types-jnifAAA0.mjs +0 -104
  83. package/dist/types-jnifAAA0.mjs.map +0 -1
@@ -0,0 +1,178 @@
1
+ const require_types = require("./types-BWHvNFlN.js");
2
+ let rxjs = require("rxjs");
3
+ //#region src/api/injectedWallets.ts
4
+ /**
5
+ * Compare two wallet arrays by their relevant properties (not functions).
6
+ * Shared by every platform's injected-wallets stream.
7
+ */
8
+ const walletsEqual = (a, b) => {
9
+ if (a.length !== b.length) return false;
10
+ return a.every((w, i) => w.id === b[i]?.id && w.status === b[i]?.status && w.error === b[i]?.error && w.name === b[i]?.name);
11
+ };
12
+ const join = (connecting, walletId, signal) => {
13
+ if (!signal) {
14
+ connecting.anchored = true;
15
+ return connecting.promise;
16
+ }
17
+ connecting.waiting++;
18
+ return new Promise((resolve, reject) => {
19
+ const leave = () => {
20
+ if (connecting.answered) return;
21
+ reject(require_types.abortedError(walletId, "connect"));
22
+ connecting.waiting--;
23
+ if (!connecting.anchored && connecting.waiting === 0) connecting.abort();
24
+ };
25
+ signal.addEventListener("abort", leave, { once: true });
26
+ connecting.promise.then(resolve, reject).finally(() => signal.removeEventListener("abort", leave));
27
+ });
28
+ };
29
+ /**
30
+ * The shared engine behind every platform's injected-wallets stream: tracks
31
+ * each wallet's connection (pending attempt or live handle), shares one
32
+ * in-flight connect per wallet, persists connected ids to the store for
33
+ * auto-reconnect, and re-emits the wallet list whenever the registry or
34
+ * connection state changes.
35
+ */
36
+ const createInjectedWallets$ = (store, adapter) => new rxjs.Observable((subscriber) => {
37
+ const connections$ = new rxjs.BehaviorSubject(/* @__PURE__ */ new Map());
38
+ const teardown = new AbortController();
39
+ let present = /* @__PURE__ */ new Set();
40
+ const abortConnectsOfSourcesThatLeft = (sources) => {
41
+ present = new Set(sources.map((source) => adapter.getWalletId(source)));
42
+ for (const [walletId, connection] of connections$.value) if (connection.status === "connecting" && !present.has(walletId)) connection.abort();
43
+ };
44
+ const setConnection = (walletId, connection) => {
45
+ const next = new Map(connections$.value);
46
+ if (connection) next.set(walletId, connection);
47
+ else next.delete(walletId);
48
+ connections$.next(next);
49
+ };
50
+ const startConnect = (source, walletId, signal) => {
51
+ const controller = new AbortController();
52
+ const connecting = {
53
+ status: "connecting",
54
+ promise: new Promise((resolve, reject) => {
55
+ controller.signal.addEventListener("abort", () => {
56
+ setConnection(walletId, void 0);
57
+ reject(require_types.abortedError(walletId, "connect"));
58
+ }, { once: true });
59
+ new Promise((res) => res(adapter.connect(source, walletId))).then((handle) => {
60
+ connecting.answered = true;
61
+ if (controller.signal.aborted) {
62
+ adapter.releaseAbandonedHandle?.(handle, walletId);
63
+ return;
64
+ }
65
+ setConnection(walletId, {
66
+ status: "connected",
67
+ handle
68
+ });
69
+ resolve();
70
+ store.rememberWallet(walletId);
71
+ }, (error) => {
72
+ connecting.answered = true;
73
+ if (controller.signal.aborted) return;
74
+ const connectError = require_types.toConnectError(error, walletId, adapter.isUserRejection ?? (() => false));
75
+ setConnection(walletId, {
76
+ status: "disconnected",
77
+ error: connectError
78
+ });
79
+ reject(connectError);
80
+ });
81
+ }),
82
+ anchored: false,
83
+ waiting: 0,
84
+ answered: false,
85
+ abort: () => {
86
+ if (connections$.value.get(walletId) === connecting) controller.abort();
87
+ }
88
+ };
89
+ setConnection(walletId, connecting);
90
+ return join(connecting, walletId, signal);
91
+ };
92
+ const untilSettled = (disconnecting, walletId, signal) => new Promise((resolve, reject) => {
93
+ const signals = signal ? [teardown.signal, signal] : [teardown.signal];
94
+ const settle = () => {
95
+ for (const s of signals) s.removeEventListener("abort", settle);
96
+ if (signals.some((s) => s.aborted)) reject(require_types.abortedError(walletId, "connect"));
97
+ else resolve();
98
+ };
99
+ if (signals.some((s) => s.aborted)) return settle();
100
+ for (const s of signals) s.addEventListener("abort", settle, { once: true });
101
+ disconnecting.then(settle, settle);
102
+ });
103
+ const connect = (source, walletId, options) => {
104
+ if (teardown.signal.aborted || !present.has(walletId)) return Promise.reject(require_types.abortedError(walletId, "connect"));
105
+ const current = connections$.value.get(walletId);
106
+ if (current?.status === "connected") {
107
+ if (!current.disconnecting) return Promise.resolve();
108
+ return untilSettled(current.disconnecting, walletId, options?.signal).then(() => connect(source, walletId, options));
109
+ }
110
+ if (options?.signal?.aborted) return Promise.reject(require_types.abortedError(walletId, "connect"));
111
+ if (current?.status === "connecting") return join(current, walletId, options?.signal);
112
+ return startConnect(source, walletId, options?.signal);
113
+ };
114
+ const disconnect = (source, walletId) => {
115
+ const current = connections$.value.get(walletId);
116
+ if (!current || current.status === "disconnected") return Promise.resolve();
117
+ if (current.status === "connecting") {
118
+ current.abort();
119
+ return Promise.resolve();
120
+ }
121
+ if (current.disconnecting) return current.disconnecting;
122
+ store.forgetWallet(walletId);
123
+ const disconnecting = (async () => {
124
+ try {
125
+ await adapter.disconnect?.(source, walletId);
126
+ } catch (error) {
127
+ if (!teardown.signal.aborted) {
128
+ setConnection(walletId, {
129
+ status: "connected",
130
+ handle: current.handle
131
+ });
132
+ store.rememberWallet(walletId);
133
+ }
134
+ throw error;
135
+ }
136
+ if (teardown.signal.aborted) return;
137
+ setConnection(walletId, void 0);
138
+ adapter.onDisconnected?.(walletId);
139
+ })();
140
+ setConnection(walletId, {
141
+ ...current,
142
+ disconnecting
143
+ });
144
+ return disconnecting;
145
+ };
146
+ const sub = (0, rxjs.combineLatest)([adapter.sources$, connections$]).pipe((0, rxjs.tap)(([sources]) => abortConnectsOfSourcesThatLeft(sources)), (0, rxjs.map)(([sources, connections]) => sources.map((source) => {
147
+ const walletId = adapter.getWalletId(source);
148
+ const connection = connections.get(walletId);
149
+ const connected = connection?.status === "connected" ? connection : void 0;
150
+ return adapter.buildWallet({
151
+ source,
152
+ walletId,
153
+ handle: connected?.handle,
154
+ status: connection?.status ?? "disconnected",
155
+ error: connection?.status === "disconnected" ? connection.error : void 0,
156
+ isConnected: connected !== void 0,
157
+ connect: (options) => connect(source, walletId, options),
158
+ disconnect: () => disconnect(source, walletId)
159
+ });
160
+ })), (0, rxjs.distinctUntilChanged)(walletsEqual)).subscribe(subscriber);
161
+ return () => {
162
+ teardown.abort();
163
+ for (const connection of connections$.value.values()) if (connection.status === "connecting") connection.abort();
164
+ sub.unsubscribe();
165
+ };
166
+ }).pipe((0, rxjs.shareReplay)({
167
+ refCount: true,
168
+ bufferSize: 1
169
+ }));
170
+ //#endregion
171
+ Object.defineProperty(exports, "createInjectedWallets$", {
172
+ enumerable: true,
173
+ get: function() {
174
+ return createInjectedWallets$;
175
+ }
176
+ });
177
+
178
+ //# sourceMappingURL=injectedWallets-Dy8YGKL-.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectedWallets-Dy8YGKL-.js","names":["abortedError","Observable","BehaviorSubject","toConnectError","combineLatest","tap","map","distinctUntilChanged","shareReplay"],"sources":["../src/api/injectedWallets.ts"],"sourcesContent":["import {\n\tBehaviorSubject,\n\tcombineLatest,\n\tdistinctUntilChanged,\n\tmap,\n\tObservable,\n\tshareReplay,\n\ttap,\n} from \"rxjs\";\nimport type { WalletId } from \"../utils/WalletId\";\nimport { abortedError, type KheopskitError, toConnectError } from \"./errors\";\nimport type { KheopskitStore } from \"./store\";\nimport type { BaseWallet, ConnectOptions, WalletStatus } from \"./types\";\n\n/**\n * Compare two wallet arrays by their relevant properties (not functions).\n * Shared by every platform's injected-wallets stream.\n */\nconst walletsEqual = <\n\tW extends Pick<BaseWallet, \"id\" | \"status\" | \"error\" | \"name\">,\n>(\n\ta: W[],\n\tb: W[],\n): boolean => {\n\tif (a.length !== b.length) return false;\n\treturn a.every(\n\t\t(w, i) =>\n\t\t\tw.id === b[i]?.id &&\n\t\t\tw.status === b[i]?.status &&\n\t\t\tw.error === b[i]?.error &&\n\t\t\tw.name === b[i]?.name,\n\t);\n};\n\n/**\n * The platform-specific surface of an injected-wallets stream. Everything else\n * — the connect/disconnect state machine, the connected-ids bookkeeping, the\n * store persistence, change detection and sharing — is owned by\n * {@link createInjectedWallets$}.\n *\n * @typeParam TSource - a wallet as the platform's registry reports it\n * @typeParam TWallet - the platform's wallet type\n * @typeParam THandle - live connection handle retained while connected\n */\nexport type InjectedWalletsAdapter<\n\tTSource,\n\tTWallet extends BaseWallet,\n\tTHandle = void,\n> = {\n\t/** Live registry of the platform's injected wallets (emits `[]` during SSR). */\n\tsources$: Observable<readonly TSource[]>;\n\t/** Stable wallet id for a registry entry. */\n\tgetWalletId: (source: TSource) => WalletId;\n\t/**\n\t * Platform connect call. The resolved value is retained as the wallet's\n\t * live handle until disconnect.\n\t */\n\tconnect: (source: TSource, walletId: WalletId) => Promise<THandle>;\n\t/** `true` maps the platform's rejection to `USER_REJECTED`; absent means never. */\n\tisUserRejection?: (error: unknown) => boolean;\n\treleaseAbandonedHandle?: (handle: THandle, walletId: WalletId) => void;\n\t/**\n\t * Optional platform disconnect call, awaited before local state clears so a\n\t * failed disconnect rejects without desyncing the connected list.\n\t */\n\tdisconnect?: (source: TSource, walletId: WalletId) => Promise<void>;\n\t/**\n\t * Runs after a disconnect fully applied — the place to drop cached account\n\t * observables so a later reconnect rebuilds them against a fresh handle.\n\t */\n\tonDisconnected?: (walletId: WalletId) => void;\n\t/** Build the platform wallet object for one registry entry. */\n\tbuildWallet: (args: {\n\t\tsource: TSource;\n\t\twalletId: WalletId;\n\t\t/** Live connection handle; `undefined` while disconnected. */\n\t\thandle: THandle | undefined;\n\t\tstatus: WalletStatus;\n\t\terror: KheopskitError | undefined;\n\t\tisConnected: boolean;\n\t\tconnect: (options?: ConnectOptions) => Promise<void>;\n\t\tdisconnect: () => Promise<void>;\n\t}) => TWallet;\n};\n\ntype Connecting = {\n\tstatus: \"connecting\";\n\tpromise: Promise<void>;\n\tanchored: boolean;\n\twaiting: number;\n\tanswered: boolean;\n\tabort: () => void;\n};\n\ntype Connection<THandle> =\n\t| Connecting\n\t| { status: \"connected\"; handle: THandle; disconnecting?: Promise<void> }\n\t| { status: \"disconnected\"; error: KheopskitError };\n\nconst join = (\n\tconnecting: Connecting,\n\twalletId: WalletId,\n\tsignal: AbortSignal | undefined,\n): Promise<void> => {\n\tif (!signal) {\n\t\tconnecting.anchored = true;\n\t\treturn connecting.promise;\n\t}\n\tconnecting.waiting++;\n\treturn new Promise<void>((resolve, reject) => {\n\t\tconst leave = () => {\n\t\t\tif (connecting.answered) return;\n\t\t\treject(abortedError(walletId, \"connect\"));\n\t\t\tconnecting.waiting--;\n\t\t\tif (!connecting.anchored && connecting.waiting === 0) connecting.abort();\n\t\t};\n\t\tsignal.addEventListener(\"abort\", leave, { once: true });\n\t\tconnecting.promise\n\t\t\t.then(resolve, reject)\n\t\t\t.finally(() => signal.removeEventListener(\"abort\", leave));\n\t});\n};\n\n/**\n * The shared engine behind every platform's injected-wallets stream: tracks\n * each wallet's connection (pending attempt or live handle), shares one\n * in-flight connect per wallet, persists connected ids to the store for\n * auto-reconnect, and re-emits the wallet list whenever the registry or\n * connection state changes.\n */\nexport const createInjectedWallets$ = <\n\tTSource,\n\tTWallet extends BaseWallet,\n\tTHandle = void,\n>(\n\tstore: KheopskitStore,\n\tadapter: InjectedWalletsAdapter<TSource, TWallet, THandle>,\n): Observable<TWallet[]> =>\n\tnew Observable<TWallet[]>((subscriber) => {\n\t\tconst connections$ = new BehaviorSubject<\n\t\t\tReadonlyMap<WalletId, Connection<THandle>>\n\t\t>(new Map());\n\t\tconst teardown = new AbortController();\n\t\tlet present = new Set<WalletId>();\n\n\t\tconst abortConnectsOfSourcesThatLeft = (sources: readonly TSource[]) => {\n\t\t\tpresent = new Set(sources.map((source) => adapter.getWalletId(source)));\n\t\t\tfor (const [walletId, connection] of connections$.value)\n\t\t\t\tif (connection.status === \"connecting\" && !present.has(walletId))\n\t\t\t\t\tconnection.abort();\n\t\t};\n\n\t\tconst setConnection = (\n\t\t\twalletId: WalletId,\n\t\t\tconnection: Connection<THandle> | undefined,\n\t\t) => {\n\t\t\tconst next = new Map(connections$.value);\n\t\t\tif (connection) next.set(walletId, connection);\n\t\t\telse next.delete(walletId);\n\t\t\tconnections$.next(next);\n\t\t};\n\n\t\tconst startConnect = (\n\t\t\tsource: TSource,\n\t\t\twalletId: WalletId,\n\t\t\tsignal: AbortSignal | undefined,\n\t\t): Promise<void> => {\n\t\t\tconst controller = new AbortController();\n\t\t\tconst promise = new Promise<void>((resolve, reject) => {\n\t\t\t\tcontroller.signal.addEventListener(\n\t\t\t\t\t\"abort\",\n\t\t\t\t\t() => {\n\t\t\t\t\t\tsetConnection(walletId, undefined);\n\t\t\t\t\t\treject(abortedError(walletId, \"connect\"));\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true },\n\t\t\t\t);\n\t\t\t\tnew Promise<THandle>((res) =>\n\t\t\t\t\tres(adapter.connect(source, walletId)),\n\t\t\t\t).then(\n\t\t\t\t\t(handle) => {\n\t\t\t\t\t\tconnecting.answered = true;\n\t\t\t\t\t\tif (controller.signal.aborted) {\n\t\t\t\t\t\t\tadapter.releaseAbandonedHandle?.(handle, walletId);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetConnection(walletId, { status: \"connected\", handle });\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t\tstore.rememberWallet(walletId);\n\t\t\t\t\t},\n\t\t\t\t\t(error) => {\n\t\t\t\t\t\tconnecting.answered = true;\n\t\t\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\t\t\tconst connectError = toConnectError(\n\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\twalletId,\n\t\t\t\t\t\t\tadapter.isUserRejection ?? (() => false),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsetConnection(walletId, {\n\t\t\t\t\t\t\tstatus: \"disconnected\",\n\t\t\t\t\t\t\terror: connectError,\n\t\t\t\t\t\t});\n\t\t\t\t\t\treject(connectError);\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t});\n\t\t\tconst connecting: Connecting = {\n\t\t\t\tstatus: \"connecting\",\n\t\t\t\tpromise,\n\t\t\t\tanchored: false,\n\t\t\t\twaiting: 0,\n\t\t\t\tanswered: false,\n\t\t\t\tabort: () => {\n\t\t\t\t\tif (connections$.value.get(walletId) === connecting)\n\t\t\t\t\t\tcontroller.abort();\n\t\t\t\t},\n\t\t\t};\n\t\t\tsetConnection(walletId, connecting);\n\t\t\treturn join(connecting, walletId, signal);\n\t\t};\n\n\t\tconst untilSettled = (\n\t\t\tdisconnecting: Promise<void>,\n\t\t\twalletId: WalletId,\n\t\t\tsignal: AbortSignal | undefined,\n\t\t): Promise<void> =>\n\t\t\tnew Promise<void>((resolve, reject) => {\n\t\t\t\tconst signals = signal ? [teardown.signal, signal] : [teardown.signal];\n\t\t\t\tconst settle = () => {\n\t\t\t\t\tfor (const s of signals) s.removeEventListener(\"abort\", settle);\n\t\t\t\t\tif (signals.some((s) => s.aborted))\n\t\t\t\t\t\treject(abortedError(walletId, \"connect\"));\n\t\t\t\t\telse resolve();\n\t\t\t\t};\n\t\t\t\tif (signals.some((s) => s.aborted)) return settle();\n\t\t\t\tfor (const s of signals)\n\t\t\t\t\ts.addEventListener(\"abort\", settle, { once: true });\n\t\t\t\tdisconnecting.then(settle, settle);\n\t\t\t});\n\n\t\tconst connect = (\n\t\t\tsource: TSource,\n\t\t\twalletId: WalletId,\n\t\t\toptions?: ConnectOptions,\n\t\t): Promise<void> => {\n\t\t\tif (teardown.signal.aborted || !present.has(walletId))\n\t\t\t\treturn Promise.reject(abortedError(walletId, \"connect\"));\n\t\t\tconst current = connections$.value.get(walletId);\n\t\t\tif (current?.status === \"connected\") {\n\t\t\t\tif (!current.disconnecting) return Promise.resolve();\n\t\t\t\treturn untilSettled(\n\t\t\t\t\tcurrent.disconnecting,\n\t\t\t\t\twalletId,\n\t\t\t\t\toptions?.signal,\n\t\t\t\t).then(() => connect(source, walletId, options));\n\t\t\t}\n\t\t\tif (options?.signal?.aborted)\n\t\t\t\treturn Promise.reject(abortedError(walletId, \"connect\"));\n\t\t\tif (current?.status === \"connecting\")\n\t\t\t\treturn join(current, walletId, options?.signal);\n\t\t\treturn startConnect(source, walletId, options?.signal);\n\t\t};\n\n\t\tconst disconnect = (source: TSource, walletId: WalletId): Promise<void> => {\n\t\t\tconst current = connections$.value.get(walletId);\n\t\t\tif (!current || current.status === \"disconnected\")\n\t\t\t\treturn Promise.resolve();\n\t\t\tif (current.status === \"connecting\") {\n\t\t\t\tcurrent.abort();\n\t\t\t\treturn Promise.resolve();\n\t\t\t}\n\t\t\tif (current.disconnecting) return current.disconnecting;\n\n\t\t\tstore.forgetWallet(walletId);\n\t\t\tconst disconnecting = (async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait adapter.disconnect?.(source, walletId);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!teardown.signal.aborted) {\n\t\t\t\t\t\tsetConnection(walletId, {\n\t\t\t\t\t\t\tstatus: \"connected\",\n\t\t\t\t\t\t\thandle: current.handle,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tstore.rememberWallet(walletId);\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tif (teardown.signal.aborted) return;\n\t\t\t\tsetConnection(walletId, undefined);\n\t\t\t\tadapter.onDisconnected?.(walletId);\n\t\t\t})();\n\t\t\tsetConnection(walletId, { ...current, disconnecting });\n\t\t\treturn disconnecting;\n\t\t};\n\n\t\tconst sub = combineLatest([adapter.sources$, connections$])\n\t\t\t.pipe(\n\t\t\t\ttap(([sources]) => abortConnectsOfSourcesThatLeft(sources)),\n\t\t\t\tmap(([sources, connections]) =>\n\t\t\t\t\tsources.map((source): TWallet => {\n\t\t\t\t\t\tconst walletId = adapter.getWalletId(source);\n\t\t\t\t\t\tconst connection = connections.get(walletId);\n\t\t\t\t\t\tconst connected =\n\t\t\t\t\t\t\tconnection?.status === \"connected\" ? connection : undefined;\n\t\t\t\t\t\treturn adapter.buildWallet({\n\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\twalletId,\n\t\t\t\t\t\t\thandle: connected?.handle,\n\t\t\t\t\t\t\tstatus: connection?.status ?? \"disconnected\",\n\t\t\t\t\t\t\terror:\n\t\t\t\t\t\t\t\tconnection?.status === \"disconnected\"\n\t\t\t\t\t\t\t\t\t? connection.error\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\tisConnected: connected !== undefined,\n\t\t\t\t\t\t\tconnect: (options) => connect(source, walletId, options),\n\t\t\t\t\t\t\tdisconnect: () => disconnect(source, walletId),\n\t\t\t\t\t\t});\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\tdistinctUntilChanged(walletsEqual),\n\t\t\t)\n\t\t\t.subscribe(subscriber);\n\n\t\treturn () => {\n\t\t\tteardown.abort();\n\t\t\tfor (const connection of connections$.value.values())\n\t\t\t\tif (connection.status === \"connecting\") connection.abort();\n\t\t\tsub.unsubscribe();\n\t\t};\n\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n"],"mappings":"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"}
@@ -1,30 +1,6 @@
1
- import { _ as WalletConnectWallet, a as CachedAccount, i as BaseWalletAccount, o as CachedWallet, r as BaseWallet } from "./types-AxUDtkR-.mjs";
1
+ import { n as getSafeLocalStorage } from "./storage-D3AwNgqc.mjs";
2
+ import { a as CachedAccount, b as WalletConnectWallet, i as BaseWalletAccount, o as CachedWallet, r as BaseWallet } from "./types-lkMXVJNG.mjs";
2
3
  import { n as clearCachedObservable, r as clearCachedObservablesByPrefix } from "./getCachedObservable-LUq9IfEx.mjs";
3
- //#region src/utils/storage.d.ts
4
- type Storage = {
5
- getItem: (key: string) => string | null;
6
- setItem: (key: string, value: string) => void;
7
- removeItem: (key: string) => void;
8
- };
9
- /**
10
- * Extended storage interface with cross-tab sync support.
11
- */
12
- type SyncableStorage = Storage & {
13
- /**
14
- * Subscribe to storage changes from other tabs.
15
- * Returns an unsubscribe function.
16
- */
17
- subscribe?: (key: string, callback: (value: string | null) => void) => () => void;
18
- };
19
- /**
20
- * A safe localStorage wrapper that falls back to noopStorage
21
- * when localStorage is not available (e.g., during SSR).
22
- * Includes cross-tab sync via the native 'storage' event.
23
- *
24
- * Lazily initialized on first access to be SSR-safe.
25
- */
26
- export declare const getSafeLocalStorage: () => SyncableStorage;
27
- //#endregion
28
4
  //#region src/utils/hydrateState.d.ts
29
5
  /**
30
6
  * Converts a wallet to a CachedWallet for storage.
@@ -47,5 +23,5 @@ export declare const serializeAccount: (account: BaseWalletAccount) => CachedAcc
47
23
  */
48
24
  export declare const setCachedIcons: (icons: Record<string, string>) => void;
49
25
  //#endregion
50
- export { clearCachedObservable, clearCachedObservablesByPrefix };
26
+ export { clearCachedObservable, clearCachedObservablesByPrefix, getSafeLocalStorage };
51
27
  //# sourceMappingURL=internal.d.mts.map
@@ -1,30 +1,6 @@
1
- import { _ as WalletConnectWallet, a as CachedAccount, i as BaseWalletAccount, o as CachedWallet, r as BaseWallet } from "./types-AxUDtkR-.js";
1
+ import { n as getSafeLocalStorage } from "./storage-D3AwNgqc.js";
2
+ import { a as CachedAccount, b as WalletConnectWallet, i as BaseWalletAccount, o as CachedWallet, r as BaseWallet } from "./types-lkMXVJNG.js";
2
3
  import { n as clearCachedObservable, r as clearCachedObservablesByPrefix } from "./getCachedObservable-LUq9IfEx.js";
3
- //#region src/utils/storage.d.ts
4
- type Storage = {
5
- getItem: (key: string) => string | null;
6
- setItem: (key: string, value: string) => void;
7
- removeItem: (key: string) => void;
8
- };
9
- /**
10
- * Extended storage interface with cross-tab sync support.
11
- */
12
- type SyncableStorage = Storage & {
13
- /**
14
- * Subscribe to storage changes from other tabs.
15
- * Returns an unsubscribe function.
16
- */
17
- subscribe?: (key: string, callback: (value: string | null) => void) => () => void;
18
- };
19
- /**
20
- * A safe localStorage wrapper that falls back to noopStorage
21
- * when localStorage is not available (e.g., during SSR).
22
- * Includes cross-tab sync via the native 'storage' event.
23
- *
24
- * Lazily initialized on first access to be SSR-safe.
25
- */
26
- export declare const getSafeLocalStorage: () => SyncableStorage;
27
- //#endregion
28
4
  //#region src/utils/hydrateState.d.ts
29
5
  /**
30
6
  * Converts a wallet to a CachedWallet for storage.
@@ -47,5 +23,5 @@ export declare const serializeAccount: (account: BaseWalletAccount) => CachedAcc
47
23
  */
48
24
  export declare const setCachedIcons: (icons: Record<string, string>) => void;
49
25
  //#endregion
50
- export { clearCachedObservable, clearCachedObservablesByPrefix };
26
+ export { clearCachedObservable, clearCachedObservablesByPrefix, getSafeLocalStorage };
51
27
  //# sourceMappingURL=internal.d.ts.map
package/dist/internal.js CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_types = require("./types-DKU-SNio.js");
3
- const require_iconCache = require("./iconCache-DUtkJlaX.js");
2
+ const require_types = require("./types-BWHvNFlN.js");
3
+ const require_iconCache = require("./iconCache-FR4iy6go.js");
4
4
  exports.clearCachedObservable = require_types.clearCachedObservable;
5
5
  exports.clearCachedObservablesByPrefix = require_types.clearCachedObservablesByPrefix;
6
6
  exports.getSafeLocalStorage = require_iconCache.getSafeLocalStorage;
package/dist/internal.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { l as clearCachedObservable, u as clearCachedObservablesByPrefix } from "./types-jnifAAA0.mjs";
2
- import { c as serializeAccount, i as getSafeLocalStorage, l as serializeWallet, n as setCachedIcons } from "./iconCache-pP2ES4pJ.mjs";
1
+ import { g as clearCachedObservablesByPrefix, h as clearCachedObservable } from "./types-Yor672md.mjs";
2
+ import { c as serializeAccount, i as getSafeLocalStorage, l as serializeWallet, n as setCachedIcons } from "./iconCache-C-U3IEbP.mjs";
3
3
  export { clearCachedObservable, clearCachedObservablesByPrefix, getSafeLocalStorage, serializeAccount, serializeWallet, setCachedIcons };
@@ -0,0 +1,24 @@
1
+ import { Observable } from "rxjs";
2
+ //#region src/utils/pageLoad.ts
3
+ const pageLoaded$ = new Observable((subscriber) => {
4
+ if (typeof document === "undefined") {
5
+ subscriber.next(false);
6
+ return;
7
+ }
8
+ if (document.readyState === "complete") {
9
+ subscriber.next(true);
10
+ subscriber.complete();
11
+ return;
12
+ }
13
+ subscriber.next(false);
14
+ const onLoad = () => {
15
+ subscriber.next(true);
16
+ subscriber.complete();
17
+ };
18
+ window.addEventListener("load", onLoad, { once: true });
19
+ return () => window.removeEventListener("load", onLoad);
20
+ });
21
+ //#endregion
22
+ export { pageLoaded$ as t };
23
+
24
+ //# sourceMappingURL=pageLoad-BZ7o8p5R.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageLoad-BZ7o8p5R.mjs","names":[],"sources":["../src/utils/pageLoad.ts"],"sourcesContent":["import { Observable } from \"rxjs\";\n\nexport const pageLoaded$ = new Observable<boolean>((subscriber) => {\n\tif (typeof document === \"undefined\") {\n\t\tsubscriber.next(false);\n\t\treturn;\n\t}\n\n\tif (document.readyState === \"complete\") {\n\t\tsubscriber.next(true);\n\t\tsubscriber.complete();\n\t\treturn;\n\t}\n\n\tsubscriber.next(false);\n\n\tconst onLoad = () => {\n\t\tsubscriber.next(true);\n\t\tsubscriber.complete();\n\t};\n\twindow.addEventListener(\"load\", onLoad, { once: true });\n\n\treturn () => window.removeEventListener(\"load\", onLoad);\n});\n"],"mappings":";;AAEA,MAAa,cAAc,IAAI,YAAqB,eAAe;CAClE,IAAI,OAAO,aAAa,aAAa;EACpC,WAAW,KAAK,KAAK;EACrB;CACD;CAEA,IAAI,SAAS,eAAe,YAAY;EACvC,WAAW,KAAK,IAAI;EACpB,WAAW,SAAS;EACpB;CACD;CAEA,WAAW,KAAK,KAAK;CAErB,MAAM,eAAe;EACpB,WAAW,KAAK,IAAI;EACpB,WAAW,SAAS;CACrB;CACA,OAAO,iBAAiB,QAAQ,QAAQ,EAAE,MAAM,KAAK,CAAC;CAEtD,aAAa,OAAO,oBAAoB,QAAQ,MAAM;AACvD,CAAC"}
@@ -0,0 +1,28 @@
1
+ //#region src/utils/pageLoad.ts
2
+ const pageLoaded$ = new (require("rxjs")).Observable((subscriber) => {
3
+ if (typeof document === "undefined") {
4
+ subscriber.next(false);
5
+ return;
6
+ }
7
+ if (document.readyState === "complete") {
8
+ subscriber.next(true);
9
+ subscriber.complete();
10
+ return;
11
+ }
12
+ subscriber.next(false);
13
+ const onLoad = () => {
14
+ subscriber.next(true);
15
+ subscriber.complete();
16
+ };
17
+ window.addEventListener("load", onLoad, { once: true });
18
+ return () => window.removeEventListener("load", onLoad);
19
+ });
20
+ //#endregion
21
+ Object.defineProperty(exports, "pageLoaded$", {
22
+ enumerable: true,
23
+ get: function() {
24
+ return pageLoaded$;
25
+ }
26
+ });
27
+
28
+ //# sourceMappingURL=pageLoad-D1wLeuFG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageLoad-D1wLeuFG.js","names":["Observable"],"sources":["../src/utils/pageLoad.ts"],"sourcesContent":["import { Observable } from \"rxjs\";\n\nexport const pageLoaded$ = new Observable<boolean>((subscriber) => {\n\tif (typeof document === \"undefined\") {\n\t\tsubscriber.next(false);\n\t\treturn;\n\t}\n\n\tif (document.readyState === \"complete\") {\n\t\tsubscriber.next(true);\n\t\tsubscriber.complete();\n\t\treturn;\n\t}\n\n\tsubscriber.next(false);\n\n\tconst onLoad = () => {\n\t\tsubscriber.next(true);\n\t\tsubscriber.complete();\n\t};\n\twindow.addEventListener(\"load\", onLoad, { once: true });\n\n\treturn () => window.removeEventListener(\"load\", onLoad);\n});\n"],"mappings":";AAEA,MAAa,cAAc,mBAAIA,EAAAA,CAAAA,YAAqB,eAAe;CAClE,IAAI,OAAO,aAAa,aAAa;EACpC,WAAW,KAAK,KAAK;EACrB;CACD;CAEA,IAAI,SAAS,eAAe,YAAY;EACvC,WAAW,KAAK,IAAI;EACpB,WAAW,SAAS;EACpB;CACD;CAEA,WAAW,KAAK,KAAK;CAErB,MAAM,eAAe;EACpB,WAAW,KAAK,IAAI;EACpB,WAAW,SAAS;CACrB;CACA,OAAO,iBAAiB,QAAQ,QAAQ,EAAE,MAAM,KAAK,CAAC;CAEtD,aAAa,OAAO,oBAAoB,QAAQ,MAAM;AACvD,CAAC"}