mirror of
https://dev.azure.com/tstanciu94/PhantomMind/_git/Bitip
synced 2025-10-13 01:52:19 +03:00
refactor: improve date formatting for version release info in footer
This commit is contained in:
parent
06a1b84f03
commit
2d428af427
@ -122,33 +122,57 @@ const server = app.listen(config.port, () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Graceful shutdown
|
// Graceful shutdown
|
||||||
|
let isShuttingDown = false;
|
||||||
|
|
||||||
const gracefulShutdown = async (signal: string): Promise<void> => {
|
const gracefulShutdown = async (signal: string): Promise<void> => {
|
||||||
|
// Prevent multiple shutdown calls
|
||||||
|
if (isShuttingDown) {
|
||||||
|
logger.warn(`Shutdown already in progress, ignoring ${signal}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
isShuttingDown = true;
|
||||||
|
|
||||||
logger.info(`Received ${signal}, shutting down gracefully`);
|
logger.info(`Received ${signal}, shutting down gracefully`);
|
||||||
|
|
||||||
server.close(async err => {
|
// Set a hard timeout for Docker (Docker default stop timeout is 10s)
|
||||||
if (err) {
|
const forceExitTimeout = setTimeout(() => {
|
||||||
logger.error('Error closing server', err);
|
logger.error('Forced shutdown after timeout');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}, 8000);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// Stop accepting new connections
|
||||||
|
await new Promise<void>((resolve, reject) => {
|
||||||
|
server.close(err => {
|
||||||
|
if (err) {
|
||||||
|
logger.error('Error closing server', err);
|
||||||
|
reject(err);
|
||||||
|
} else {
|
||||||
|
logger.info('Server closed successfully');
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Flush logs
|
||||||
await logger.flush();
|
await logger.flush();
|
||||||
|
logger.info('Logs flushed successfully');
|
||||||
|
|
||||||
|
// Clean exit
|
||||||
|
clearTimeout(forceExitTimeout);
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error('Error during graceful shutdown', error as Error);
|
logger.error('Error during graceful shutdown', error as Error);
|
||||||
|
clearTimeout(forceExitTimeout);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
// Force close after 5 seconds
|
|
||||||
setTimeout(() => {
|
|
||||||
logger.error('Forced shutdown after timeout');
|
|
||||||
process.exit(1);
|
|
||||||
}, 3000);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Docker sends SIGTERM for graceful shutdown
|
||||||
process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
|
process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
|
||||||
|
// Ctrl+C in development
|
||||||
process.on('SIGINT', () => gracefulShutdown('SIGINT'));
|
process.on('SIGINT', () => gracefulShutdown('SIGINT'));
|
||||||
|
// Nodemon uses SIGUSR2 for restart
|
||||||
process.on('SIGUSR2', () => gracefulShutdown('SIGUSR2')); // nodemon uses SIGUSR2
|
process.on('SIGUSR2', () => gracefulShutdown('SIGUSR2')); // nodemon uses SIGUSR2
|
||||||
|
|
||||||
// Handle server errors
|
// Handle server errors
|
||||||
|
@ -78,7 +78,7 @@ const App: React.FC = () => {
|
|||||||
<p className="version-info">
|
<p className="version-info">
|
||||||
Version {versionInfo.version}
|
Version {versionInfo.version}
|
||||||
{versionInfo.createdAt !== 'unknown' &&
|
{versionInfo.createdAt !== 'unknown' &&
|
||||||
` | Released ${new Date(versionInfo.createdAt).toLocaleDateString()}`}
|
` | Released ${new Date(versionInfo.createdAt).toLocaleString()}`}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
</footer>
|
</footer>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user