import "dotenv/config"; import { createServer } from "node:http"; import { Server } from "socket.io"; import type { ServerToClientEvents, ClientToServerEvents, InterServerEvents, SocketData, } from "@storybid/shared"; import { app } from "./app.js"; import { registerSocketHandlers } from "./socket/index.js"; import { startScheduler } from "./services/scheduler.js"; import { prisma } from "./lib/prisma.js"; const PORT = parseInt(process.env["PORT"] ?? "3001", 10); const httpServer = createServer(app); export const io = new Server< ClientToServerEvents, ServerToClientEvents, InterServerEvents, SocketData >(httpServer, { cors: { origin: process.env["NODE_ENV"] === "production" ? [process.env["PUBLIC_URL"] ?? "", process.env["CLIENT_URL"] ?? ""] : "*", credentials: true, }, }); registerSocketHandlers(io); startScheduler(io); httpServer.listen(PORT, () => { console.log(`[server] listening on http://localhost:${PORT}`); console.log(`[server] NODE_ENV=${process.env["NODE_ENV"] ?? "development"}`); }); // Graceful shutdown const shutdown = async () => { console.log("[server] shutting down…"); await prisma.$disconnect(); httpServer.close(() => process.exit(0)); }; process.on("SIGTERM", shutdown); process.on("SIGINT", shutdown);