80 lines
1.8 KiB
JavaScript
80 lines
1.8 KiB
JavaScript
const logger = require('./logger').module('MaintenanceMode');
|
|||
|
|
|
||
|
|
const MAINTENANCE_TIMEOUT_MS = 30 * 60 * 1000;
|
||
|
|
|
||
|
|
const MaintenanceMode = {
|
||
|
|
isActive: false,
|
||
|
|
startTime: null,
|
||
|
|
reason: null,
|
||
|
|
allowedRoutes: ['/api/backup', '/api/auth', '/api/maintenance'],
|
||
|
|
};
|
||
|
|
|
||
|
|
let timeoutTimer = null;
|
||
|
|
|
||
|
|
function clearTimeoutTimer() {
|
||
|
|
if (timeoutTimer) {
|
||
|
|
clearTimeout(timeoutTimer);
|
||
|
|
timeoutTimer = null;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function isTimedOut() {
|
||
|
|
if (!MaintenanceMode.startTime) return false;
|
||
|
|
return Date.now() - MaintenanceMode.startTime.getTime() > MAINTENANCE_TIMEOUT_MS;
|
||
|
|
}
|
||
|
|
|
||
|
|
function enableMaintenanceMode(reason = '系统维护中') {
|
||
|
|
clearTimeoutTimer();
|
||
|
|
|
||
|
|
MaintenanceMode.isActive = true;
|
||
|
|
MaintenanceMode.startTime = new Date();
|
||
|
|
MaintenanceMode.reason = reason;
|
||
|
|
|
||
|
|
timeoutTimer = setTimeout(() => {
|
||
|
|
if (MaintenanceMode.isActive) {
|
||
|
|
logger.warn('维护模式超时,自动解除', {
|
||
|
|
reason: MaintenanceMode.reason,
|
||
|
|
startTime: MaintenanceMode.startTime,
|
||
|
|
});
|
||
|
|
disableMaintenanceMode();
|
||
|
|
}
|
||
|
|
}, MAINTENANCE_TIMEOUT_MS);
|
||
|
|
|
||
|
|
logger.info('维护模式已启用', { reason });
|
||
|
|
}
|
||
|
|
|
||
|
|
function disableMaintenanceMode() {
|
||
|
|
clearTimeoutTimer();
|
||
|
|
|
||
|
|
MaintenanceMode.isActive = false;
|
||
|
|
MaintenanceMode.reason = null;
|
||
|
|
MaintenanceMode.startTime = null;
|
||
|
|
|
||
|
|
logger.info('维护模式已解除');
|
||
|
|
}
|
||
|
|
|
||
|
|
function isMaintenanceModeActive() {
|
||
|
|
if (MaintenanceMode.isActive && isTimedOut()) {
|
||
|
|
disableMaintenanceMode();
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
return MaintenanceMode.isActive;
|
||
|
|
}
|
||
|
|
|
||
|
|
function getMaintenanceStatus() {
|
||
|
|
return {
|
||
|
|
active: MaintenanceMode.isActive,
|
||
|
|
reason: MaintenanceMode.reason,
|
||
|
|
startTime: MaintenanceMode.startTime,
|
||
|
|
timeoutMs: MAINTENANCE_TIMEOUT_MS,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
module.exports = {
|
||
|
|
MaintenanceMode,
|
||
|
|
enableMaintenanceMode,
|
||
|
|
disableMaintenanceMode,
|
||
|
|
isMaintenanceModeActive,
|
||
|
|
getMaintenanceStatus,
|
||
|
|
};
|