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;
|
||
}
|