SHA256
46 lines
1.6 KiB
JavaScript
46 lines
1.6 KiB
JavaScript
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;
|
|
}
|