Spaces:
Configuration error
Configuration error
File size: 4,076 Bytes
2c6bb7b |
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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
import express from 'express'
import { createServer } from 'http'
import { Server } from 'socket.io'
import cors from 'cors'
import helmet from 'helmet'
import compression from 'compression'
import morgan from 'morgan'
import dotenv from 'dotenv'
import path from 'path'
// Load environment variables
dotenv.config()
// Import routes and middleware
import authRoutes from './routes/auth'
import userRoutes from './routes/users'
import chatRoutes from './routes/chats'
import messageRoutes from './routes/messages'
import uploadRoutes from './routes/upload'
import adminRoutes from './routes/admin'
// Import middleware
import { errorHandler } from './middleware/errorHandler'
import { rateLimiter } from './middleware/rateLimiter'
import { authMiddleware } from './middleware/auth'
// Import socket handlers
import { setupSocketHandlers } from './socket'
// Import database
import { initializeDatabase } from './config/database'
const app = express()
const server = createServer(app)
// Initialize Socket.IO
const io = new Server(server, {
cors: {
origin: process.env.CORS_ORIGIN || "http://localhost:5173",
methods: ["GET", "POST"],
credentials: true
},
transports: ['websocket', 'polling']
})
// Middleware
app.use(helmet({
crossOriginEmbedderPolicy: false,
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
styleSrc: ["'self'", "'unsafe-inline'"],
scriptSrc: ["'self'"],
imgSrc: ["'self'", "data:", "https:"],
},
},
}))
app.use(cors({
origin: process.env.CORS_ORIGIN || "http://localhost:5173",
credentials: true
}))
app.use(compression())
app.use(morgan('combined'))
app.use(express.json({ limit: '10mb' }))
app.use(express.urlencoded({ extended: true, limit: '10mb' }))
// Rate limiting
app.use(rateLimiter)
// Static files
app.use('/uploads', express.static(path.join(__dirname, '../uploads')))
// Health check
app.get('/health', (req, res) => {
res.json({
status: 'OK',
timestamp: new Date().toISOString(),
uptime: process.uptime()
})
})
// API Routes
app.use('/api/auth', authRoutes)
app.use('/api/users', authMiddleware, userRoutes)
app.use('/api/chats', authMiddleware, chatRoutes)
app.use('/api/messages', authMiddleware, messageRoutes)
app.use('/api/upload', authMiddleware, uploadRoutes)
app.use('/api/admin', authMiddleware, adminRoutes)
// 404 handler
app.use('*', (req, res) => {
res.status(404).json({
success: false,
error: 'Route not found'
})
})
// Error handling middleware
app.use(errorHandler)
// Setup Socket.IO handlers
setupSocketHandlers(io)
// Initialize database and start server
async function startServer() {
try {
// Initialize database connection
await initializeDatabase()
console.log('Database connected successfully')
const PORT = process.env.PORT || 3001
const HOST = process.env.HOST || 'localhost'
server.listen(PORT, () => {
console.log(`π Server running on http://${HOST}:${PORT}`)
console.log(`π‘ Socket.IO server ready`)
console.log(`π Environment: ${process.env.NODE_ENV || 'development'}`)
})
} catch (error) {
console.error('Failed to start server:', error)
process.exit(1)
}
}
// Graceful shutdown
process.on('SIGTERM', () => {
console.log('SIGTERM received, shutting down gracefully')
server.close(() => {
console.log('Server closed')
process.exit(0)
})
})
process.on('SIGINT', () => {
console.log('SIGINT received, shutting down gracefully')
server.close(() => {
console.log('Server closed')
process.exit(0)
})
})
// Handle uncaught exceptions
process.on('uncaughtException', (error) => {
console.error('Uncaught Exception:', error)
process.exit(1)
})
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason)
process.exit(1)
})
startServer()
export { app, server, io }
|