Skip to content

Commit d5662f4

Browse files
committed
feat: add graceful server shutdown with database and socket disconnection
1 parent ac92a8a commit d5662f4

File tree

3 files changed

+25
-5
lines changed

3 files changed

+25
-5
lines changed

src/lib/database.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,8 @@ export const connectDatabase = async () => {
1212
process.exit(1);
1313
}
1414
};
15+
16+
export const disconnectDatabase = async () => {
17+
await mongoose.disconnect();
18+
logger.info("Database disconnected");
19+
};

src/main.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import session from "express-session";
1414
import helmet from "helmet";
1515
import morgan from "morgan";
1616
import config from "./config/config.service";
17-
import { connectDatabase } from "./lib/database";
17+
import { connectDatabase, disconnectDatabase } from "./lib/database";
1818
import logger, { httpLogger } from "./lib/logger.service";
1919
import { useSocketIo } from "./lib/realtime.server";
2020
import redisStore from "./lib/session.store";
@@ -27,17 +27,17 @@ import YAML from "yaml";
2727
import { convertDocumentationToYaml } from "./openapi/swagger-doc-generator";
2828
import globalErrorHandler from "./utils/globalErrorHandler";
2929

30-
const boostrapServer = async () => {
31-
await connectDatabase();
32-
33-
const app = express();
30+
const app = express();
3431

3532
app.set("trust proxy", true);
3633

3734
const server = createServer(app);
3835

3936
const io = useSocketIo(server);
4037

38+
const boostrapServer = async () => {
39+
await connectDatabase();
40+
4141
app.use((req, _, next) => {
4242
req.io = io;
4343
next();
@@ -116,3 +116,17 @@ boostrapServer().catch((err) => {
116116
logger.error(err.message);
117117
process.exit(1);
118118
});
119+
120+
for (const signal of ["SIGINT", "SIGTERM"]) {
121+
process.on(signal, async () => {
122+
await disconnectDatabase();
123+
logger.info("Server is shutting down...");
124+
io.disconnectSockets(true);
125+
logger.info("Server disconnected from sockets");
126+
server.close();
127+
logger.info("Server closed");
128+
process.exit(0);
129+
});
130+
}
131+
132+

src/modules/user/user.controller.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export const handleCreateSuperAdmin = async (
4040
_: Request<unknown, unknown, unknown>,
4141
res: Response,
4242
) => {
43+
4344
const user = await createUser({
4445
email: config.ADMIN_EMAIL,
4546
name: "Super Admin",

0 commit comments

Comments
 (0)