| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- 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();
|