fix(admin): honor server kill-switch; stop booting from stale cache
Do not load admin from old get_user cache after version bump/timeout. Show server-unavailable on 503 and fatal memory responses. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+40
-18
@@ -357,6 +357,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function showServerUnavailable() {
|
function showServerUnavailable() {
|
||||||
|
if (configTimeoutId) {
|
||||||
|
clearTimeout(configTimeoutId);
|
||||||
|
configTimeoutId = null;
|
||||||
|
}
|
||||||
|
mainScriptLoaded = true; // جلوی timeout برای لود main
|
||||||
var appRoot = document.querySelector('#app') || document.body;
|
var appRoot = document.querySelector('#app') || document.body;
|
||||||
appRoot.innerHTML =
|
appRoot.innerHTML =
|
||||||
'<div style="min-height:100vh;display:flex;align-items:center;justify-content:center;direction:rtl;font-family:sans-serif;padding:24px;background:#fff;color:#111827;">' +
|
'<div style="min-height:100vh;display:flex;align-items:center;justify-content:center;direction:rtl;font-family:sans-serif;padding:24px;background:#fff;color:#111827;">' +
|
||||||
@@ -392,6 +397,12 @@
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
const { config } = await fetchConfig();
|
const { config } = await fetchConfig();
|
||||||
|
if (isServerUnreachable(config)) {
|
||||||
|
writeCachedAppConfig(config);
|
||||||
|
showServerUnavailable();
|
||||||
|
cancelVersionUpdateLock();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
clearBootstrapCachesKeepToken();
|
clearBootstrapCachesKeepToken();
|
||||||
writeCachedAppConfig(config);
|
writeCachedAppConfig(config);
|
||||||
applyConfig(config);
|
applyConfig(config);
|
||||||
@@ -402,31 +413,43 @@
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Version update failed:', error);
|
console.error('Version update failed:', error);
|
||||||
cancelVersionUpdateLock();
|
cancelVersionUpdateLock();
|
||||||
return false;
|
// بعد از bump نسخه (مثلاً قفل سوپر) کش قدیمی reachable را قبول نکن
|
||||||
|
showServerUnavailable();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function loadConfig() {
|
async function loadConfig() {
|
||||||
|
let versionChanged = false;
|
||||||
|
let needsFreshForVersion = false;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// ۱) کش get_user — اگر بود سریع اعمال شود
|
// کش قدیمی را فقط اگر خودش قفل باشد اعمال/قطع کن؛ وگرنه تا get_user تازه صبر کن
|
||||||
const cachedConfig = readCachedAppConfig();
|
const cachedConfig = readCachedAppConfig();
|
||||||
if (cachedConfig) {
|
if (cachedConfig && isServerUnreachable(cachedConfig)) {
|
||||||
applyConfig(cachedConfig);
|
showServerUnavailable();
|
||||||
console.log('Applied cached get_user');
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ۲) get_version — اگر تغییر کرده hard refresh
|
|
||||||
const remoteVersion = await loadVersion();
|
const remoteVersion = await loadVersion();
|
||||||
if (remoteVersion && shouldUpdateForVersion(remoteVersion) && canStartVersionUpdate(remoteVersion)) {
|
needsFreshForVersion = Boolean(remoteVersion && shouldUpdateForVersion(remoteVersion));
|
||||||
|
versionChanged = Boolean(
|
||||||
|
needsFreshForVersion && canStartVersionUpdate(remoteVersion)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (versionChanged) {
|
||||||
const updating = await applyVersionUpdate(remoteVersion);
|
const updating = await applyVersionUpdate(remoteVersion);
|
||||||
if (updating) {
|
if (updating) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ۳) تازه کردن get_user و کش
|
|
||||||
const { config, url } = await fetchConfig();
|
const { config, url } = await fetchConfig();
|
||||||
applyConfig(config);
|
applyConfig(config);
|
||||||
|
writeCachedAppConfig(config);
|
||||||
|
if (remoteVersion) {
|
||||||
|
writeStoredAppVersion(remoteVersion);
|
||||||
|
}
|
||||||
console.log('Config loaded successfully from', url, config);
|
console.log('Config loaded successfully from', url, config);
|
||||||
finishConfigLoad(config);
|
finishConfigLoad(config);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -436,7 +459,12 @@
|
|||||||
}
|
}
|
||||||
console.warn('Config loader: Could not fetch config from any endpoint');
|
console.warn('Config loader: Could not fetch config from any endpoint');
|
||||||
console.warn('Error details:', error && error.message ? error.message : error);
|
console.warn('Error details:', error && error.message ? error.message : error);
|
||||||
console.warn('App will continue with empty/cached config.');
|
|
||||||
|
// اگر نسخه عوض شده (قفل/آنلاک)، هرگز با کش قدیمی reachable ادمین را بالا نیاور
|
||||||
|
if (versionChanged || needsFreshForVersion) {
|
||||||
|
showServerUnavailable();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const cachedConfig = readCachedAppConfig();
|
const cachedConfig = readCachedAppConfig();
|
||||||
if (cachedConfig) {
|
if (cachedConfig) {
|
||||||
@@ -470,20 +498,14 @@
|
|||||||
|
|
||||||
configTimeoutId = setTimeout(function() {
|
configTimeoutId = setTimeout(function() {
|
||||||
if (!mainScriptLoaded) {
|
if (!mainScriptLoaded) {
|
||||||
console.warn('Config loader: Timeout reached. Loading main.ts with empty/cached config.');
|
console.warn('Config loader: Timeout reached.');
|
||||||
const cachedConfig = readCachedAppConfig();
|
const cachedConfig = readCachedAppConfig();
|
||||||
if (isServerUnreachable(cachedConfig) || isServerUnreachable(window.__APP_CONFIG__)) {
|
if (isServerUnreachable(cachedConfig) || isServerUnreachable(window.__APP_CONFIG__)) {
|
||||||
showServerUnavailable();
|
showServerUnavailable();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
window.__APP_CONFIG__ = cachedConfig || window.__APP_CONFIG__ || {};
|
// بدون تأیید تازه از get_user، ادمین را با کش بالا نیاور (دور زدن قفل)
|
||||||
window.__CONFIG_READY__ = true;
|
showServerUnavailable();
|
||||||
|
|
||||||
if (configResolve) {
|
|
||||||
configResolve(window.__APP_CONFIG__);
|
|
||||||
}
|
|
||||||
|
|
||||||
loadMainScript();
|
|
||||||
}
|
}
|
||||||
}, CONFIG_TIMEOUT);
|
}, CONFIG_TIMEOUT);
|
||||||
|
|
||||||
|
|||||||
@@ -88,6 +88,16 @@ _axios.interceptors.response.use(
|
|||||||
showServerUnavailableOverlay('خطا در برقراری ارتباط با سرور')
|
showServerUnavailableOverlay('خطا در برقراری ارتباط با سرور')
|
||||||
return Promise.reject(error)
|
return Promise.reject(error)
|
||||||
}
|
}
|
||||||
|
// PHP fatal / memory (گاهی بهجای 503 تمیز) — پنل را باز نگه ندار
|
||||||
|
if (
|
||||||
|
error.response &&
|
||||||
|
error.response.status >= 500 &&
|
||||||
|
typeof error.response.data?.message === 'string' &&
|
||||||
|
/Allowed memory size|Fatal error|server/i.test(error.response.data.message)
|
||||||
|
) {
|
||||||
|
showServerUnavailableOverlay('خطا در برقراری ارتباط با سرور')
|
||||||
|
return Promise.reject(error)
|
||||||
|
}
|
||||||
if (error.response && error.response.status == 401) {
|
if (error.response && error.response.status == 401) {
|
||||||
///removeToken()
|
///removeToken()
|
||||||
console.log('error')
|
console.log('error')
|
||||||
|
|||||||
Reference in New Issue
Block a user