@solana/wallet-adapter-sollet
Advanced tools
Comparing version 0.5.2 to 0.6.0
import { BaseSignerWalletAdapter, WalletAdapterNetwork } from '@solana/wallet-adapter-base'; | ||
import { PublicKey, Transaction } from '@solana/web3.js'; | ||
declare type SolletProvider = string | { | ||
interface SolletWallet { | ||
postMessage(...args: unknown[]): unknown; | ||
}; | ||
} | ||
export interface SolletWalletAdapterConfig { | ||
provider?: SolletProvider; | ||
provider?: string | SolletWallet; | ||
network?: WalletAdapterNetwork; | ||
pollInterval?: number; | ||
pollCount?: number; | ||
} | ||
@@ -10,0 +12,0 @@ export declare class SolletWalletAdapter extends BaseSignerWalletAdapter { |
@@ -30,6 +30,8 @@ "use strict"; | ||
}; | ||
this._provider = config.provider || 'https://www.sollet.io'; | ||
this._provider = config.provider || (typeof window === 'undefined' ? undefined : window.sollet); | ||
this._network = config.network || wallet_adapter_base_1.WalletAdapterNetwork.Mainnet; | ||
this._connecting = false; | ||
this._wallet = null; | ||
if (!this.ready) | ||
(0, wallet_adapter_base_1.pollUntilReady)(this, config.pollInterval || 1000, config.pollCount || 3); | ||
} | ||
@@ -41,4 +43,5 @@ get publicKey() { | ||
get ready() { | ||
// @FIXME | ||
return typeof window !== 'undefined'; | ||
var _a; | ||
return (typeof this._provider === 'string' || | ||
(typeof window !== 'undefined' && typeof ((_a = window.sollet) === null || _a === void 0 ? void 0 : _a.postMessage) === 'function')); | ||
} | ||
@@ -62,33 +65,62 @@ get connecting() { | ||
this._connecting = true; | ||
const provider = this._provider || (typeof window !== 'undefined' && window.sollet); | ||
if (!provider) | ||
throw new wallet_adapter_base_1.WalletNotFoundError(); | ||
let wallet; | ||
let interval; | ||
try { | ||
wallet = new sol_wallet_adapter_1.default(this._provider, this._network); | ||
// HACK: sol-wallet-adapter doesn't reject or emit an event if the popup is closed or blocked | ||
yield new Promise((resolve, reject) => { | ||
wallet.connect().then(resolve, reject); | ||
if (typeof this._provider === 'string') { | ||
let count = 0; | ||
interval = setInterval(() => { | ||
const popup = wallet._popup; | ||
if (popup) { | ||
if (popup.closed) | ||
reject(new wallet_adapter_base_1.WalletWindowClosedError()); | ||
} | ||
else { | ||
if (count > 50) | ||
reject(new wallet_adapter_base_1.WalletWindowBlockedError()); | ||
} | ||
count++; | ||
}, 100); | ||
} | ||
}); | ||
wallet = new sol_wallet_adapter_1.default(provider, this._network); | ||
// HACK: sol-wallet-adapter doesn't reject or emit an event if the popup or extension is closed or blocked | ||
const handleDisconnect = wallet.handleDisconnect; | ||
let timeout; | ||
let interval; | ||
try { | ||
yield new Promise((resolve, reject) => { | ||
const connect = () => { | ||
if (timeout) | ||
clearTimeout(timeout); | ||
wallet.off('connect', connect); | ||
resolve(); | ||
}; | ||
wallet.handleDisconnect = (...args) => { | ||
wallet.off('connect', connect); | ||
reject(new wallet_adapter_base_1.WalletWindowClosedError()); | ||
return handleDisconnect.apply(wallet, args); | ||
}; | ||
wallet.on('connect', connect); | ||
wallet.connect().catch((reason) => { | ||
wallet.off('connect', connect); | ||
reject(reason); | ||
}); | ||
if (typeof provider === 'string') { | ||
let count = 0; | ||
interval = setInterval(() => { | ||
const popup = wallet._popup; | ||
if (popup) { | ||
if (popup.closed) | ||
reject(new wallet_adapter_base_1.WalletWindowClosedError()); | ||
} | ||
else { | ||
if (count > 50) | ||
reject(new wallet_adapter_base_1.WalletWindowBlockedError()); | ||
} | ||
count++; | ||
}, 100); | ||
} | ||
else { | ||
// HACK: sol-wallet-adapter doesn't reject or emit an event if the extension is closed or ignored | ||
timeout = setTimeout(() => reject(new wallet_adapter_base_1.WalletTimeoutError()), 10000); | ||
} | ||
}); | ||
} | ||
finally { | ||
wallet.handleDisconnect = handleDisconnect; | ||
if (interval) | ||
clearInterval(interval); | ||
} | ||
} | ||
catch (error) { | ||
if (error instanceof wallet_adapter_base_1.WalletError) | ||
throw error; | ||
throw new wallet_adapter_base_1.WalletConnectionError(error === null || error === void 0 ? void 0 : error.message, error); | ||
} | ||
finally { | ||
if (interval) | ||
clearInterval(interval); | ||
} | ||
wallet.on('disconnect', this._disconnected); | ||
@@ -113,4 +145,26 @@ this._wallet = wallet; | ||
this._wallet = null; | ||
// HACK: sol-wallet-adapter doesn't reliably fulfill its promise or emit an event on disconnect | ||
const handleDisconnect = wallet.handleDisconnect; | ||
try { | ||
yield wallet.disconnect(); | ||
yield new Promise((resolve, reject) => { | ||
const timeout = setTimeout(() => resolve(), 250); | ||
wallet.handleDisconnect = (...args) => { | ||
clearTimeout(timeout); | ||
resolve(); | ||
return handleDisconnect.apply(wallet, args); | ||
}; | ||
wallet.disconnect().then(() => { | ||
clearTimeout(timeout); | ||
resolve(); | ||
}, (error) => { | ||
clearTimeout(timeout); | ||
// HACK: sol-wallet-adapter rejects with an error on disconnect | ||
if (error.message === 'Wallet disconnected') { | ||
resolve(); | ||
} | ||
else { | ||
reject(error); | ||
} | ||
}); | ||
}); | ||
} | ||
@@ -120,2 +174,5 @@ catch (error) { | ||
} | ||
finally { | ||
wallet.handleDisconnect = handleDisconnect; | ||
} | ||
this.emit('disconnect'); | ||
@@ -122,0 +179,0 @@ } |
{ | ||
"name": "@solana/wallet-adapter-sollet", | ||
"version": "0.5.2", | ||
"version": "0.6.0", | ||
"author": "Solana Maintainers <maintainers@solana.foundation>", | ||
@@ -33,3 +33,3 @@ "repository": "https://github.com/solana-labs/wallet-adapter", | ||
}, | ||
"gitHead": "f1c15aa0c22d2fa6a566bc095f05e4fde4745230" | ||
"gitHead": "139856c15453e583411b162a927c42f3c99ca158" | ||
} |
import Wallet from '@project-serum/sol-wallet-adapter'; | ||
import { | ||
BaseSignerWalletAdapter, | ||
pollUntilReady, | ||
WalletAdapterNetwork, | ||
@@ -8,4 +9,7 @@ WalletConnectionError, | ||
WalletDisconnectionError, | ||
WalletError, | ||
WalletNotConnectedError, | ||
WalletNotFoundError, | ||
WalletSignTransactionError, | ||
WalletTimeoutError, | ||
WalletWindowBlockedError, | ||
@@ -16,11 +20,21 @@ WalletWindowClosedError, | ||
type SolletProvider = string | { postMessage(...args: unknown[]): unknown }; | ||
interface SolletWallet { | ||
postMessage(...args: unknown[]): unknown; | ||
} | ||
interface SolletWindow extends Window { | ||
sollet?: SolletWallet; | ||
} | ||
declare const window: SolletWindow; | ||
export interface SolletWalletAdapterConfig { | ||
provider?: SolletProvider; | ||
provider?: string | SolletWallet; | ||
network?: WalletAdapterNetwork; | ||
pollInterval?: number; | ||
pollCount?: number; | ||
} | ||
export class SolletWalletAdapter extends BaseSignerWalletAdapter { | ||
private _provider: SolletProvider; | ||
private _provider: string | SolletWallet | undefined; | ||
private _network: WalletAdapterNetwork; | ||
@@ -32,6 +46,8 @@ private _connecting: boolean; | ||
super(); | ||
this._provider = config.provider || 'https://www.sollet.io'; | ||
this._provider = config.provider || (typeof window === 'undefined' ? undefined : window.sollet); | ||
this._network = config.network || WalletAdapterNetwork.Mainnet; | ||
this._connecting = false; | ||
this._wallet = null; | ||
if (!this.ready) pollUntilReady(this, config.pollInterval || 1000, config.pollCount || 3); | ||
} | ||
@@ -44,4 +60,6 @@ | ||
get ready(): boolean { | ||
// @FIXME | ||
return typeof window !== 'undefined'; | ||
return ( | ||
typeof this._provider === 'string' || | ||
(typeof window !== 'undefined' && typeof window.sollet?.postMessage === 'function') | ||
); | ||
} | ||
@@ -66,30 +84,59 @@ | ||
const provider = this._provider || (typeof window !== 'undefined' && window.sollet); | ||
if (!provider) throw new WalletNotFoundError(); | ||
let wallet: Wallet; | ||
let interval: NodeJS.Timer | undefined; | ||
try { | ||
wallet = new Wallet(this._provider, this._network); | ||
wallet = new Wallet(provider, this._network); | ||
// HACK: sol-wallet-adapter doesn't reject or emit an event if the popup is closed or blocked | ||
await new Promise<void>((resolve, reject) => { | ||
wallet.connect().then(resolve, reject); | ||
// HACK: sol-wallet-adapter doesn't reject or emit an event if the popup or extension is closed or blocked | ||
const handleDisconnect: (...args: unknown[]) => unknown = (wallet as any).handleDisconnect; | ||
let timeout: NodeJS.Timer | undefined; | ||
let interval: NodeJS.Timer | undefined; | ||
try { | ||
await new Promise<void>((resolve, reject) => { | ||
const connect = () => { | ||
if (timeout) clearTimeout(timeout); | ||
wallet.off('connect', connect); | ||
resolve(); | ||
}; | ||
if (typeof this._provider === 'string') { | ||
let count = 0; | ||
(wallet as any).handleDisconnect = (...args: unknown[]): unknown => { | ||
wallet.off('connect', connect); | ||
reject(new WalletWindowClosedError()); | ||
return handleDisconnect.apply(wallet, args); | ||
}; | ||
interval = setInterval(() => { | ||
const popup = (wallet as any)._popup; | ||
if (popup) { | ||
if (popup.closed) reject(new WalletWindowClosedError()); | ||
} else { | ||
if (count > 50) reject(new WalletWindowBlockedError()); | ||
} | ||
wallet.on('connect', connect); | ||
count++; | ||
}, 100); | ||
} | ||
}); | ||
wallet.connect().catch((reason: any) => { | ||
wallet.off('connect', connect); | ||
reject(reason); | ||
}); | ||
if (typeof provider === 'string') { | ||
let count = 0; | ||
interval = setInterval(() => { | ||
const popup = (wallet as any)._popup; | ||
if (popup) { | ||
if (popup.closed) reject(new WalletWindowClosedError()); | ||
} else { | ||
if (count > 50) reject(new WalletWindowBlockedError()); | ||
} | ||
count++; | ||
}, 100); | ||
} else { | ||
// HACK: sol-wallet-adapter doesn't reject or emit an event if the extension is closed or ignored | ||
timeout = setTimeout(() => reject(new WalletTimeoutError()), 10000); | ||
} | ||
}); | ||
} finally { | ||
(wallet as any).handleDisconnect = handleDisconnect; | ||
if (interval) clearInterval(interval); | ||
} | ||
} catch (error: any) { | ||
if (error instanceof WalletError) throw error; | ||
throw new WalletConnectionError(error?.message, error); | ||
} finally { | ||
if (interval) clearInterval(interval); | ||
} | ||
@@ -117,6 +164,34 @@ | ||
// HACK: sol-wallet-adapter doesn't reliably fulfill its promise or emit an event on disconnect | ||
const handleDisconnect: (...args: unknown[]) => unknown = (wallet as any).handleDisconnect; | ||
try { | ||
await wallet.disconnect(); | ||
await new Promise<void>((resolve, reject) => { | ||
const timeout = setTimeout(() => resolve(), 250); | ||
(wallet as any).handleDisconnect = (...args: unknown[]): unknown => { | ||
clearTimeout(timeout); | ||
resolve(); | ||
return handleDisconnect.apply(wallet, args); | ||
}; | ||
wallet.disconnect().then( | ||
() => { | ||
clearTimeout(timeout); | ||
resolve(); | ||
}, | ||
(error) => { | ||
clearTimeout(timeout); | ||
// HACK: sol-wallet-adapter rejects with an error on disconnect | ||
if (error.message === 'Wallet disconnected') { | ||
resolve(); | ||
} else { | ||
reject(error); | ||
} | ||
} | ||
); | ||
}); | ||
} catch (error: any) { | ||
this.emit('error', new WalletDisconnectionError(error?.message, error)); | ||
} finally { | ||
(wallet as any).handleDisconnect = handleDisconnect; | ||
} | ||
@@ -123,0 +198,0 @@ |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
38500
462