const SOLANA_WEB3_SCRIPT_SRC = './solana-web3.iife.min.js'; let solanaWeb3Promise = null; function getExistingScript() { return document.querySelector('script[data-shine-solana-web3="1"]'); } function resolveScriptUrl() { return new URL(SOLANA_WEB3_SCRIPT_SRC, import.meta.url).toString(); } export function loadSolanaWeb3() { if (typeof window === 'undefined' || typeof document === 'undefined') { return Promise.reject(new Error('Solana Web3 loader доступен только в браузере')); } if (window.solanaWeb3) { return Promise.resolve(window.solanaWeb3); } if (!solanaWeb3Promise) { solanaWeb3Promise = new Promise((resolve, reject) => { const existing = getExistingScript(); if (existing) { existing.addEventListener('load', () => resolve(window.solanaWeb3), { once: true }); existing.addEventListener('error', () => reject(new Error('Не удалось загрузить локальный solana-web3.js')), { once: true }); return; } const script = document.createElement('script'); script.src = resolveScriptUrl(); script.async = true; script.dataset.shineSolanaWeb3 = '1'; script.onload = () => { if (!window.solanaWeb3) { reject(new Error('Локальный solana-web3.js загружен, но объект solanaWeb3 недоступен')); return; } resolve(window.solanaWeb3); }; script.onerror = () => reject(new Error('Не удалось загрузить локальный solana-web3.js')); document.head.appendChild(script); }); } return solanaWeb3Promise; }