diff --git a/CHANGELOG.md b/CHANGELOG.md index 242b8365e..9ed4b8ec0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,8 @@ We're back with another update with over 50 commits! - improve upscaler compatibility - enable upscaler compile by default - fix shape mismatch errors on too many resolution changes + - **ZLUDA** + - update to `zluda==3.8.8` - **Other** - **Asymmetric tiling** allows for configurable image tiling for x/y axis separately @@ -90,6 +92,8 @@ We're back with another update with over 50 commits! - force pydantic version reinstall/reload - multi-unit when using controlnet-union - pulid with hidiffusion + - api: stricter access control + - api: universal handle mount subpaths ## Update for 2025-02-05 diff --git a/javascript/extraNetworks.js b/javascript/extraNetworks.js index 516f346eb..796efe051 100644 --- a/javascript/extraNetworks.js +++ b/javascript/extraNetworks.js @@ -294,7 +294,7 @@ function selectHistory(id) { const headers = new Headers(); headers.set('Content-Type', 'application/json'); const init = { method: 'POST', body: { name: id }, headers }; - fetch('/sdapi/v1/history', { method: 'POST', body: JSON.stringify({ name: id }), headers }); + fetch(`${window.api}/history`, { method: 'POST', body: JSON.stringify({ name: id }), headers }); } let enDirty = false; diff --git a/javascript/gallery.js b/javascript/gallery.js index a2c225441..ae3270dc8 100644 --- a/javascript/gallery.js +++ b/javascript/gallery.js @@ -92,7 +92,7 @@ async function addSeparators() { async function delayFetchThumb(fn) { while (outstanding > 16) await new Promise((resolve) => setTimeout(resolve, 50)); // eslint-disable-line no-promise-executor-return outstanding++; - const res = await fetch(`/sdapi/v1/browser/thumb?file=${encodeURI(fn)}`, { priority: 'low' }); + const res = await fetch(`${window.api}/browser/thumb?file=${encodeURI(fn)}`, { priority: 'low' }); if (!res.ok) { error(`fetchThumb: ${res.statusText}`); outstanding--; @@ -334,7 +334,7 @@ async function fetchFilesHT(evt) { el.status.innerText = `Folder | ${evt.target.name} | in-progress`; let numFiles = 0; - const res = await fetch(`/sdapi/v1/browser/files?folder=${encodeURI(evt.target.name)}`); + const res = await fetch(`${window.api}/browser/files?folder=${encodeURI(evt.target.name)}`); if (!res || res.status !== 200) { el.status.innerText = `Folder | ${evt.target.name} | failed: ${res?.statusText}`; return; @@ -412,7 +412,7 @@ async function pruneImages() { async function galleryVisible() { // if (el.folders.children.length > 0) return; - const res = await fetch('/sdapi/v1/browser/folders'); + const res = await fetch(`${window.api}/browser/folders`); if (!res || res.status !== 200) return; el.folders.innerHTML = ''; url = res.url.split('/sdapi')[0].replace('http', 'ws'); // update global url as ws need fqdn diff --git a/javascript/loader.js b/javascript/loader.js index 8cd4811bf..35b54ad9b 100644 --- a/javascript/loader.js +++ b/javascript/loader.js @@ -37,7 +37,7 @@ async function createSplash() { await preloadImages(); const imgEl = `
`; document.getElementById('splash').insertAdjacentHTML('afterbegin', imgEl); - fetch('/sdapi/v1/motd') + fetch(`${window.api}/motd`) .then((res) => res.text()) .then((text) => { const motdEl = document.getElementById('motd'); @@ -52,7 +52,7 @@ async function removeSplash() { log('removeSplash'); const t = Math.round(performance.now() - appStartTime) / 1000; log('startupTime', t); - xhrPost('/sdapi/v1/log', { message: `ready time=${t}` }); + xhrPost(`${window.api}/log`, { message: `ready time=${t}` }); } window.onload = createSplash; diff --git a/javascript/logMonitor.js b/javascript/logMonitor.js index 1e76cb3fe..9648ce43b 100644 --- a/javascript/logMonitor.js +++ b/javascript/logMonitor.js @@ -70,7 +70,7 @@ async function logMonitor() { if (!logMonitorEl) return; const atBottom = logMonitorEl.scrollHeight <= (logMonitorEl.scrollTop + logMonitorEl.clientHeight); try { - const res = await fetch('/sdapi/v1/log?clear=True'); + const res = await fetch(`${window.api}/log?clear=True`); if (res?.ok) { logMonitorStatus = true; const lines = await res.json(); @@ -116,7 +116,7 @@ async function initLogMonitor() { `; el.style.display = 'none'; - fetch(`/sdapi/v1/start?agent=${encodeURI(navigator.userAgent)}`); + fetch(`${window.api}/start?agent=${encodeURI(navigator.userAgent)}`); logMonitor(); log('initLogMonitor'); } diff --git a/javascript/login.js b/javascript/login.js index 41bb5e941..50f1d2f87 100644 --- a/javascript/login.js +++ b/javascript/login.js @@ -25,7 +25,7 @@ const loginHTML = ` function forceLogin() { const form = document.createElement('form'); form.method = 'POST'; - form.action = '/login'; + form.action = `${location.href}login`; form.id = 'loginForm'; form.style.cssText = loginCSS; form.innerHTML = loginHTML; @@ -39,8 +39,8 @@ function forceLogin() { const formData = new FormData(form); formData.append('username', username.value); formData.append('password', password.value); - console.warn('login', formData); - fetch('/login', { + console.warn('login', location.href, formData); + fetch(`${location.href}login`, { method: 'POST', body: formData, }) @@ -59,7 +59,7 @@ function forceLogin() { } function loginCheck() { - fetch('/login_check', {}) + fetch(`${location.href}login_check`, {}) .then((res) => { if (res.status === 200) console.log('login ok'); else forceLogin(); diff --git a/javascript/nvml.js b/javascript/nvml.js index 0a82cba1b..cf55bb196 100644 --- a/javascript/nvml.js +++ b/javascript/nvml.js @@ -30,7 +30,7 @@ async function updateNVMLChart(mem, load) { async function updateNVML() { try { - const res = await fetch('/sdapi/v1/nvml'); + const res = await fetch(`${window.api}/nvml`); if (!res.ok) { clearInterval(nvmlInterval); nvmlEl.style.display = 'none'; diff --git a/javascript/setHints.js b/javascript/setHints.js index 374dd8582..e7e63645f 100644 --- a/javascript/setHints.js +++ b/javascript/setHints.js @@ -136,16 +136,16 @@ async function getLocaleData(desiredLocale = null) { // primary let json = {}; try { - let res = await fetch(`/file=html/locale_${localeData.locale}.json`); + let res = await fetch(`${window.subpath}/file=html/locale_${localeData.locale}.json`); if (!res || !res.ok) { localeData.locale = 'en'; - res = await fetch(`/file=html/locale_${localeData.locale}.json`); + res = await fetch(`${window.subpath}/file=html/locale_${localeData.locale}.json`); } json = await res.json(); } catch { /**/ } try { - const res = await fetch(`/file=html/override_${localeData.locale}.json`); + const res = await fetch(`${window.subpath}/file=html/override_${localeData.locale}.json`); if (res && res.ok) json.override = await res.json(); } catch { /**/ } diff --git a/javascript/settings.js b/javascript/settings.js index a5ec1cd15..1a891c844 100644 --- a/javascript/settings.js +++ b/javascript/settings.js @@ -152,7 +152,7 @@ async function initModels() { const el = gradioApp().getElementById('main_info'); const en = gradioApp().getElementById('txt2img_extra_networks'); if (!el || !en) return; - const req = await fetch('/sdapi/v1/sd-models'); + const req = await fetch(`${window.api}/sd-models`); const res = req.ok ? await req.json() : []; log('initModels', res.length); const ready = () => ` diff --git a/javascript/startup.js b/javascript/startup.js index 3e121eb12..d8407391d 100644 --- a/javascript/startup.js +++ b/javascript/startup.js @@ -1,4 +1,6 @@ /* eslint-disable no-undef */ +window.api = '/sdapi/v1'; +window.subpath = ''; async function initStartup() { log('initStartup'); @@ -23,6 +25,11 @@ async function initStartup() { // make sure all of the ui is ready and options are loaded while (Object.keys(window.opts).length === 0) await sleep(50); + log('mountURL', window.opts.subpath); + if (window.opts.subpath?.length > 0) { + window.subpath = window.opts.subpath; + window.api = `${window.subpath}/sdapi/v1`; + } executeCallbacks(uiReadyCallbacks); initLogMonitor(); setupExtraNetworks(); diff --git a/javascript/ui.js b/javascript/ui.js index bb1b3b889..7193f9470 100644 --- a/javascript/ui.js +++ b/javascript/ui.js @@ -385,7 +385,7 @@ function monitorServerStatus() {