UNPKG

@svelte-on-solana/wallet-adapter-core

Version:

The core of the wallet adapter is a Svelte Store which exposes methods and properties to run the wallet in your application. This allows to share this data among all components in your application.

286 lines 12.3 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.initialize = exports.walletStore = void 0; const wallet_adapter_base_1 = require("@solana/wallet-adapter-base"); const store_1 = require("svelte/store"); const errors_1 = require("./errors"); const localStorage_1 = require("./localStorage"); exports.walletStore = createWalletStore(); function addAdapterEventListeners(adapter) { const { onError, wallets } = (0, store_1.get)(exports.walletStore); wallets.forEach(({ adapter }) => { adapter.on('readyStateChange', onReadyStateChange, adapter); }); adapter.on('connect', onConnect); adapter.on('disconnect', onDisconnect); adapter.on('error', onError); } function autoConnect() { return __awaiter(this, void 0, void 0, function* () { const { adapter } = (0, store_1.get)(exports.walletStore); try { exports.walletStore.setConnecting(true); yield (adapter === null || adapter === void 0 ? void 0 : adapter.connect()); } catch (error) { // Clear the selected wallet exports.walletStore.resetWallet(); // Don't throw error, but onError will still be called } finally { exports.walletStore.setConnecting(false); } }); } function connect() { return __awaiter(this, void 0, void 0, function* () { const { connected, connecting, disconnecting, ready, adapter } = (0, store_1.get)(exports.walletStore); if (connected || connecting || disconnecting) return; if (!adapter) throw newError(new errors_1.WalletNotSelectedError()); if (!(ready === wallet_adapter_base_1.WalletReadyState.Installed || ready === wallet_adapter_base_1.WalletReadyState.Loadable)) { exports.walletStore.resetWallet(); if (typeof window !== 'undefined') { window.open(adapter.url, '_blank'); } throw newError(new wallet_adapter_base_1.WalletNotReadyError()); } try { exports.walletStore.setConnecting(true); yield adapter.connect(); } catch (error) { exports.walletStore.resetWallet(); throw error; } finally { exports.walletStore.setConnecting(false); } }); } function createWalletStore() { const { subscribe, update } = (0, store_1.writable)({ autoConnect: false, wallets: [], adapter: null, connected: false, connecting: false, disconnecting: false, localStorageKey: 'walletAdapter', onError: (error) => console.error(error), publicKey: null, ready: 'Unsupported', wallet: null, name: null, walletsByName: {}, connect, disconnect, select, sendTransaction, signTransaction: undefined, signAllTransactions: undefined, signMessage: undefined, }); function updateWalletState(adapter) { updateAdapter(adapter); update((store) => (Object.assign(Object.assign({}, store), { name: (adapter === null || adapter === void 0 ? void 0 : adapter.name) || null, wallet: adapter, ready: (adapter === null || adapter === void 0 ? void 0 : adapter.readyState) || 'Unsupported', publicKey: (adapter === null || adapter === void 0 ? void 0 : adapter.publicKey) || null, connected: (adapter === null || adapter === void 0 ? void 0 : adapter.connected) || false }))); if (!adapter) return; if (shouldAutoConnect()) { autoConnect(); } } function updateWalletName(name) { var _a; const { localStorageKey, walletsByName } = (0, store_1.get)(exports.walletStore); const adapter = (_a = walletsByName === null || walletsByName === void 0 ? void 0 : walletsByName[name]) !== null && _a !== void 0 ? _a : null; (0, localStorage_1.setLocalStorage)(localStorageKey, name); updateWalletState(adapter); } function updateAdapter(adapter) { removeAdapterEventListeners(); let signTransaction = undefined; let signAllTransactions = undefined; let signMessage = undefined; if (adapter) { // Sign a transaction if the wallet supports it if ('signTransaction' in adapter) { signTransaction = function (transaction) { return __awaiter(this, void 0, void 0, function* () { const { connected } = (0, store_1.get)(exports.walletStore); if (!connected) throw newError(new wallet_adapter_base_1.WalletNotConnectedError()); return yield adapter.signTransaction(transaction); }); }; } // Sign multiple transactions if the wallet supports it if ('signAllTransactions' in adapter) { signAllTransactions = function (transactions) { return __awaiter(this, void 0, void 0, function* () { const { connected } = (0, store_1.get)(exports.walletStore); if (!connected) throw newError(new wallet_adapter_base_1.WalletNotConnectedError()); return yield adapter.signAllTransactions(transactions); }); }; } // Sign an arbitrary message if the wallet supports it if ('signMessage' in adapter) { signMessage = function (message) { return __awaiter(this, void 0, void 0, function* () { const { connected } = (0, store_1.get)(exports.walletStore); if (!connected) throw newError(new wallet_adapter_base_1.WalletNotConnectedError()); return yield adapter.signMessage(message); }); }; } addAdapterEventListeners(adapter); } update((store) => (Object.assign(Object.assign({}, store), { adapter, signTransaction, signAllTransactions, signMessage }))); } return { resetWallet: () => updateWalletName(null), setConnecting: (connecting) => update((store) => (Object.assign(Object.assign({}, store), { connecting }))), setDisconnecting: (disconnecting) => update((store) => (Object.assign(Object.assign({}, store), { disconnecting }))), setReady: (ready) => update((store) => (Object.assign(Object.assign({}, store), { ready }))), subscribe, updateConfig: (walletConfig) => update((store) => (Object.assign(Object.assign({}, store), walletConfig))), updateWallets: (wallets) => update((store) => (Object.assign(Object.assign({}, store), wallets))), updateStatus: (walletStatus) => update((store) => (Object.assign(Object.assign({}, store), walletStatus))), updateWallet: (walletName) => updateWalletName(walletName), }; } function disconnect() { return __awaiter(this, void 0, void 0, function* () { const { disconnecting, adapter } = (0, store_1.get)(exports.walletStore); if (disconnecting) return; if (!adapter) return exports.walletStore.resetWallet(); try { exports.walletStore.setDisconnecting(true); yield adapter.disconnect(); } finally { exports.walletStore.resetWallet(); exports.walletStore.setDisconnecting(false); } }); } function initialize({ wallets, autoConnect = false, localStorageKey = 'walletAdapter', onError = (error) => console.error(error), }) { return __awaiter(this, void 0, void 0, function* () { const walletsByName = wallets.reduce((walletsByName, wallet) => { walletsByName[wallet.name] = wallet; return walletsByName; }, {}); // Wrap adapters to conform to the `Wallet` interface const mapWallets = wallets.map((adapter) => ({ adapter, readyState: adapter.readyState, })); exports.walletStore.updateConfig({ wallets: mapWallets, walletsByName, autoConnect, localStorageKey, onError, }); const walletName = (0, localStorage_1.getLocalStorage)(localStorageKey); if (walletName) { exports.walletStore.updateWallet(walletName); } }); } exports.initialize = initialize; function newError(error) { const { onError } = (0, store_1.get)(exports.walletStore); onError(error); return error; } function onConnect() { const { adapter } = (0, store_1.get)(exports.walletStore); if (!adapter) return; exports.walletStore.updateStatus({ publicKey: adapter.publicKey, connected: adapter.connected, }); } function onDisconnect() { exports.walletStore.resetWallet(); } function onReadyStateChange(readyState) { const { adapter, wallets } = (0, store_1.get)(exports.walletStore); if (!adapter) return; exports.walletStore.setReady(adapter.readyState); // When the wallets change, start to listen for changes to their `readyState` const walletIndex = wallets.findIndex(({ adapter }) => adapter.name === this.name); if (walletIndex === -1) { return; } else { exports.walletStore.updateWallets([ ...wallets.slice(0, walletIndex), Object.assign(Object.assign({}, wallets[walletIndex]), { readyState }), ...wallets.slice(walletIndex + 1), ]); } } function removeAdapterEventListeners() { const { adapter, onError, wallets } = (0, store_1.get)(exports.walletStore); if (!adapter) return; wallets.forEach(({ adapter }) => { adapter.off('readyStateChange', onReadyStateChange, adapter); }); adapter.off('connect', onConnect); adapter.off('disconnect', onDisconnect); adapter.off('error', onError); } function select(walletName) { return __awaiter(this, void 0, void 0, function* () { const { name, adapter } = (0, store_1.get)(exports.walletStore); if (name === walletName) return; if (adapter) yield disconnect(); exports.walletStore.updateWallet(walletName); }); } function sendTransaction(transaction, connection, options) { return __awaiter(this, void 0, void 0, function* () { const { connected, adapter } = (0, store_1.get)(exports.walletStore); if (!connected) throw newError(new wallet_adapter_base_1.WalletNotConnectedError()); if (!adapter) throw newError(new errors_1.WalletNotSelectedError()); return yield adapter.sendTransaction(transaction, connection, options); }); } function shouldAutoConnect() { const { adapter, autoConnect, ready, connected, connecting } = (0, store_1.get)(exports.walletStore); return !(!autoConnect || !adapter || !(ready === wallet_adapter_base_1.WalletReadyState.Installed || ready === wallet_adapter_base_1.WalletReadyState.Loadable) || connected || connecting); } if (typeof window !== 'undefined') { // Ensure the adapter listeners are invalidated before refreshing the page. window.addEventListener('beforeunload', removeAdapterEventListeners); } //# sourceMappingURL=walletStore.js.map