Repository navigation
Expand file tree
/
Copy pathserver.ts
More file actions
86 lines (72 loc) · 2.29 KB
/
Copy pathserver.ts
File metadata and controls
86 lines (72 loc) · 2.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import { app } from './app';
import { env } from './config/envs';
import { logger } from '@platform/logger';
import { bootstrap, EtaModuleHandle } from './modules/eta';
let etaModule: EtaModuleHandle | null = null;
let isShuttingDown = false;
(async () => {
try {
/* Initialize TypeORM DataSource */
logger.info('Initializing TypeORM DataSource...');
await datasource.initialize();
logger.info('TypeORM DataSource initialized successfully', {
database: env.DB_NAME ?? '(env DB_NAME not set)',
host: env.DB_HOST,
});
app.listen(env.PORT, () => {
logger.info(`Server is running in port ${env.PORT}!`);
});
/* Bootstrap the ETA module — connects RabbitMQ, provisions the command queue */
logger.info('Initializing ETA module...');
etaModule = await bootstrap(
{
url: env.RABBITMQ_URL,
username: env.RABBITMQ_USER,
password: env.RABBITMQ_PASS,
heartbeat: Number(env.RABBITMQ_HEARTBEAT),
},
datasource,
);
logger.info('ETA module initialized successfully');
} catch (error) {
logger.error('Failed to bootstrap ETA module', {
error: error instanceof Error ? error.message : String(error),
});
process.exit(1);
}
})();
/* Graceful shutdown handlers */
process.on('SIGTERM', () => shutdown('SIGTERM'));
process.on('SIGINT', () => shutdown('SIGINT'));
process.on('unhandledRejection', (reason) => {
logger.error('Unhandled promise rejection', { reason: String(reason) });
});
process.on('uncaughtException', (err) => {
logger.error('Uncaught exception', {
message: err.message,
stack: err.stack,
});
process.exit(1);
});
async function shutdown(signal: string): Promise<void> {
if (isShuttingDown) return;
isShuttingDown = true;
logger.info(`Received ${signal}, starting graceful shutdown...`);
try {
if (etaModule) {
await etaModule.destroy();
}
/* Gracefully close TypeORM DataSource */
if (datasource.isInitialized) {
await datasource.destroy();
logger.info('TypeORM DataSource closed.');
}
logger.info('Graceful shutdown completed.');
process.exit(0);
} catch (err) {
logger.error('Error during graceful shutdown', {
error: err instanceof Error ? err.message : String(err),
});
process.exit(1);
}
}