refactor: improve date formatting for version release info in footer

This commit is contained in:
Tudor Stanciu 2025-10-04 04:02:09 +03:00
parent 06a1b84f03
commit 2d428af427
2 changed files with 43 additions and 19 deletions

View File

@ -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);
process.exit(1);
}
try {
await logger.flush();
process.exit(0);
} catch (error) {
logger.error('Error during graceful shutdown', error as Error);
process.exit(1);
}
});
// Force close after 5 seconds
setTimeout(() => {
logger.error('Forced shutdown after timeout'); logger.error('Forced shutdown after timeout');
process.exit(1); process.exit(1);
}, 3000); }, 8000);
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();
logger.info('Logs flushed successfully');
// Clean exit
clearTimeout(forceExitTimeout);
process.exit(0);
} catch (error) {
logger.error('Error during graceful shutdown', error as Error);
clearTimeout(forceExitTimeout);
process.exit(1);
}
}; };
// 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

View File

@ -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>