UNPKG

minimal-xec-wallet

Version:

A minimalist eCash (XEC) wallet npm library, for use in web apps. Supports eTokens.

264 lines (217 loc) โ€ข 9.65 kB
/* Browser Compatibility Test - WebAssembly Loading Tests various WASM loading strategies for browser compatibility. Demonstrates fallback mechanisms for older browsers. */ /* global WebAssembly, Worker, navigator, crypto */ const MinimalXECWallet = require('../../index') // Browser compatibility detection utility function detectBrowserCapabilities () { const capabilities = { webAssembly: false, webAssemblyCompile: false, webAssemblyInstantiate: false, webWorkers: false, cryptoSubtle: false, userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : 'Node.js' } try { // WebAssembly support if (typeof WebAssembly !== 'undefined') { capabilities.webAssembly = true if (typeof WebAssembly.compile === 'function') { capabilities.webAssemblyCompile = true } if (typeof WebAssembly.instantiate === 'function') { capabilities.webAssemblyInstantiate = true } } // Web Worker support if (typeof Worker !== 'undefined') { capabilities.webWorkers = true } // Crypto.subtle support if (typeof crypto !== 'undefined' && crypto.subtle) { capabilities.cryptoSubtle = true } } catch (err) { console.warn('Error detecting browser capabilities:', err.message) } return capabilities } // Test WebAssembly loading strategies async function testWASMStrategies () { console.log('๐Ÿงช Testing WebAssembly Loading Strategies...\n') const capabilities = detectBrowserCapabilities() console.log('๐Ÿ“Š Browser Capabilities:') console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•') console.log(`WebAssembly Support: ${capabilities.webAssembly ? 'โœ…' : 'โŒ'}`) console.log(`WebAssembly.compile: ${capabilities.webAssemblyCompile ? 'โœ…' : 'โŒ'}`) console.log(`WebAssembly.instantiate: ${capabilities.webAssemblyInstantiate ? 'โœ…' : 'โŒ'}`) console.log(`Web Workers: ${capabilities.webWorkers ? 'โœ…' : 'โŒ'}`) console.log(`Crypto.subtle: ${capabilities.cryptoSubtle ? 'โœ…' : 'โŒ'}`) console.log(`User Agent: ${capabilities.userAgent}`) console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n') // Test different loading strategies const strategies = [ { name: 'Async Compilation', available: capabilities.webAssemblyCompile, description: 'Modern async WebAssembly.compile() method' }, { name: 'Web Worker Compilation', available: capabilities.webWorkers && capabilities.webAssembly, description: 'Compile WASM in worker thread (bypasses main thread restrictions)' }, { name: 'Chunked Loading', available: capabilities.webAssembly, description: 'Split large WASM into smaller chunks' }, { name: 'JavaScript Fallbacks', available: true, description: 'Pure JavaScript crypto implementations (always available)' } ] console.log('โš™๏ธ Available Loading Strategies:') console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•') strategies.forEach((strategy, index) => { const status = strategy.available ? 'โœ… Available' : 'โŒ Not Available' console.log(`${index + 1}. ${strategy.name}: ${status}`) console.log(` ${strategy.description}`) }) console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n') return capabilities } // Test wallet initialization with WASM compatibility async function testWalletCompatibility () { console.log('๐Ÿฆ Testing Wallet Initialization...\n') try { console.log('Creating wallet instance...') const startTime = Date.now() // Create wallet (this will trigger WASM initialization) const wallet = new MinimalXECWallet() console.log('Waiting for wallet creation...') await wallet.walletInfoPromise console.log('Waiting for WASM initialization...') const wasmResult = await wallet.wasmInitPromise console.log('Initializing wallet services...') await wallet.initialize() const endTime = Date.now() const initTime = endTime - startTime console.log('โœ… Wallet initialization completed!') console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•') console.log(`Initialization Time: ${initTime}ms`) console.log(`WASM Initialized: ${wasmResult ? 'โœ…' : 'โŒ (using fallbacks)'}`) console.log(`Wallet Address: ${wallet.walletInfo.xecAddress}`) console.log(`Wallet Created: ${wallet.walletInfoCreated ? 'โœ…' : 'โŒ'}`) console.log(`Services Initialized: ${wallet.isInitialized ? 'โœ…' : 'โŒ'}`) console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n') return { success: true, initTime, wasmResult, address: wallet.walletInfo.xecAddress } } catch (err) { console.error('โŒ Wallet initialization failed:') console.error('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•') console.error(`Error: ${err.message}`) console.error('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n') return { success: false, error: err.message } } } // Test basic wallet operations async function testBasicOperations () { console.log('๐Ÿ”ง Testing Basic Wallet Operations...\n') try { const wallet = new MinimalXECWallet() await wallet.walletInfoPromise await wallet.wasmInitPromise await wallet.initialize() console.log('Testing wallet operations...') // Test address validation const isValidAddress = wallet._validateAddress(wallet.walletInfo.xecAddress) console.log(`Address validation: ${isValidAddress ? 'โœ…' : 'โŒ'}`) // Test key derivation const keyPair = await wallet.getKeyPair(0) console.log(`Key derivation: ${keyPair && keyPair.xecAddress ? 'โœ…' : 'โŒ'}`) // Test WIF operations const wif = wallet.exportPrivateKeyAsWIF() const isValidWIF = wallet.validateWIF(wif) console.log(`WIF operations: ${isValidWIF ? 'โœ…' : 'โŒ'}`) // Test balance query (will fail without funds, but should not crash) try { await wallet.getXecBalance() console.log('Balance query: โœ…') } catch (err) { console.log(`Balance query: โš ๏ธ (${err.message})`) } console.log('\nโœ… Basic operations test completed!') return true } catch (err) { console.error(`โŒ Basic operations failed: ${err.message}`) return false } } // Main test function async function runCompatibilityTests () { console.log('๐Ÿš€ Minimal XEC Wallet - Browser Compatibility Test\n') console.log('This test checks WebAssembly loading and fallback mechanisms.\n') const results = { capabilities: null, walletInit: null, basicOps: null } try { // Test 1: Browser capabilities results.capabilities = await testWASMStrategies() // Test 2: Wallet initialization results.walletInit = await testWalletCompatibility() // Test 3: Basic operations (only if wallet init succeeded) if (results.walletInit.success) { results.basicOps = await testBasicOperations() } // Final report console.log('\n๐Ÿ“‹ Compatibility Test Summary:') console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•') console.log(`Browser Support: ${results.capabilities.webAssembly ? 'Modern' : 'Legacy'}`) console.log(`Wallet Initialization: ${results.walletInit.success ? 'โœ…' : 'โŒ'}`) console.log(`Basic Operations: ${results.basicOps ? 'โœ…' : results.walletInit.success ? 'Skipped' : 'โŒ'}`) if (results.walletInit.success) { console.log(`Initialization Time: ${results.walletInit.initTime}ms`) console.log(`WASM Status: ${results.walletInit.wasmResult ? 'Active' : 'Fallback'}`) } console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•') if (results.walletInit.success) { console.log('\n๐ŸŽ‰ SUCCESS: Wallet is compatible with this browser!') console.log('You can use all wallet features normally.') } else { console.log('\nโš ๏ธ WARNING: Wallet initialization failed in this browser.') console.log('Please check browser console for detailed error messages.') } console.log('\n๐Ÿ“š For more info: https://github.com/your-repo/minimal-xec-wallet#browser-compatibility') } catch (err) { console.error('\n๐Ÿ’ฅ Compatibility test crashed:', err.message) console.error('Please report this issue with your browser details.') } } // Run tests if this file is executed directly if (require.main === module) { runCompatibilityTests().catch(err => { console.error('Test execution failed:', err) process.exit(1) }) } module.exports = { detectBrowserCapabilities, testWASMStrategies, testWalletCompatibility, testBasicOperations, runCompatibilityTests }