const app = require('./app'); const { testConnection } = require('./config/database'); const logger = require('./utils/logger'); const { createServer } = require('http'); const { Server } = require('socket.io'); const PORT = process.env.PORT || 3000; // Test database connection and start server const startServer = async () => { try { // Test database connection await testConnection(); // Create HTTP server const server = createServer(app); // Initialize Socket.io const io = new Server(server, { cors: { origin: process.env.CORS_ORIGIN || "*", methods: ["GET", "POST"], credentials: true } }); // Socket.io connection handling io.on('connection', (socket) => { logger.info(`Client connected: ${socket.id}`); // Handle subscription to symbols socket.on('subscribe', (symbols) => { if (Array.isArray(symbols)) { symbols.forEach(symbol => { socket.join(`symbol:${symbol}`); logger.info(`Client ${socket.id} subscribed to ${symbol}`); }); } else { socket.join(`symbol:${symbols}`); logger.info(`Client ${socket.id} subscribed to ${symbols}`); } }); // Handle unsubscription socket.on('unsubscribe', (symbols) => { if (Array.isArray(symbols)) { symbols.forEach(symbol => { socket.leave(`symbol:${symbol}`); logger.info(`Client ${socket.id} unsubscribed from ${symbol}`); }); } else { socket.leave(`symbol:${symbols}`); logger.info(`Client ${socket.id} unsubscribed from ${symbols}`); } }); // Handle disconnect socket.on('disconnect', () => { logger.info(`Client disconnected: ${socket.id}`); }); }); // Make io accessible to routes/controllers app.set('io', io); // Start the server server.listen(PORT, () => { logger.info(`Market Data Service is running on port ${PORT}`); logger.info(`Environment: ${process.env.NODE_ENV || 'development'}`); logger.info(`Health check available at: http://localhost:${PORT}/health`); logger.info(`WebSocket server ready for connections`); }); // Graceful shutdown process.on('SIGTERM', () => { logger.info('SIGTERM received, shutting down gracefully'); server.close(() => { logger.info('Process terminated'); process.exit(0); }); }); process.on('SIGINT', () => { logger.info('SIGINT received, shutting down gracefully'); server.close(() => { logger.info('Process terminated'); process.exit(0); }); }); } catch (error) { logger.error('Failed to start server:', error); process.exit(1); } }; // Handle uncaught exceptions process.on('uncaughtException', (error) => { logger.error('Uncaught Exception:', error); process.exit(1); }); // Handle unhandled promise rejections process.on('unhandledRejection', (reason, promise) => { logger.error('Unhandled Rejection at:', promise, 'reason:', reason); process.exit(1); }); startServer();