|
<!DOCTYPE html> |
|
<html lang="en"> |
|
<head> |
|
<meta charset="UTF-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
<title>Black Forest Labs - Load Balanced Streamlit</title> |
|
|
|
|
|
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"> |
|
<meta http-equiv="Pragma" content="no-cache"> |
|
<meta http-equiv="Expires" content="0"> |
|
|
|
<style> |
|
html, body { |
|
margin: 0; |
|
padding: 0; |
|
width: 100%; |
|
height: 100%; |
|
} |
|
#loading { |
|
position: fixed; |
|
top: 0; |
|
left: 0; |
|
width: 100%; |
|
height: 100%; |
|
background: rgba(255, 255, 255, 0.8); |
|
display: flex; |
|
justify-content: center; |
|
align-items: center; |
|
font-size: 24px; |
|
z-index: 1000; |
|
} |
|
iframe { |
|
width: 100%; |
|
height: 100vh; |
|
border: none; |
|
} |
|
</style> |
|
</head> |
|
<body> |
|
<div id="loading">Please wait Memilih server optimal...</div> |
|
<iframe id="streamlit-frame"></iframe> |
|
|
|
<script> |
|
|
|
const VERSION = "v4"; |
|
|
|
|
|
const SERVERS = [ |
|
"https://geminisearchv4-98spcxxh9ybnwlmgborvn4.streamlit.app/?embed=true", |
|
"https://geminisearchv4-98spcxxh9ybnwlmgborvn4.streamlit.app/?embed=true" |
|
]; |
|
|
|
|
|
async function checkServerSpeed(url) { |
|
const start = performance.now(); |
|
try { |
|
const response = await Promise.race([ |
|
fetch(url, { method: 'HEAD', mode: 'no-cors' }), |
|
new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), 5000)) |
|
]); |
|
const end = performance.now(); |
|
return end - start; |
|
} catch (error) { |
|
console.error(`Error checking ${url}:`, error); |
|
return Infinity; |
|
} |
|
} |
|
|
|
|
|
async function chooseServer() { |
|
const speeds = await Promise.all(SERVERS.map(checkServerSpeed)); |
|
const fastestIndex = speeds.indexOf(Math.min(...speeds)); |
|
return SERVERS[fastestIndex]; |
|
} |
|
|
|
|
|
async function loadStreamlit() { |
|
const loadingElement = document.getElementById('loading'); |
|
const iframe = document.getElementById('streamlit-frame'); |
|
|
|
|
|
const storageKey = `streamlitUrl_${VERSION}`; |
|
let chosenUrl = sessionStorage.getItem(storageKey); |
|
|
|
if (!chosenUrl) { |
|
|
|
chosenUrl = await chooseServer(); |
|
sessionStorage.setItem(storageKey, chosenUrl); |
|
} |
|
|
|
|
|
const cacheBuster = new Date().getTime(); |
|
const iframeSrc = `${chosenUrl}&cb=${cacheBuster}`; |
|
|
|
|
|
iframe.src = iframeSrc; |
|
|
|
|
|
iframe.onload = () => { |
|
loadingElement.style.display = 'none'; |
|
}; |
|
|
|
|
|
iframe.onerror = async () => { |
|
console.warn('Iframe load failed, rechoosing server...'); |
|
sessionStorage.removeItem(storageKey); |
|
chosenUrl = await chooseServer(); |
|
sessionStorage.setItem(storageKey, chosenUrl); |
|
iframe.src = `${chosenUrl}&cb=${new Date().getTime()}`; |
|
}; |
|
} |
|
|
|
|
|
window.onload = loadStreamlit; |
|
</script> |
|
</body> |
|
</html> |