Files
sim/apps/sim/socket/index.ts
Waleed d707d18ee6 fix(build): update dockerfile to contain testing package deps (#2591)
* fix(build): update dockerfile to contain testing package deps

* added logger package
2025-12-26 12:20:38 -08:00

113 lines
3.0 KiB
TypeScript

import { createServer } from 'http'
import { createLogger } from '@sim/logger'
import { env } from '@/lib/core/config/env'
import { createSocketIOServer } from '@/socket/config/socket'
import { setupAllHandlers } from '@/socket/handlers'
import { type AuthenticatedSocket, authenticateSocket } from '@/socket/middleware/auth'
import { RoomManager } from '@/socket/rooms/manager'
import { createHttpHandler } from '@/socket/routes/http'
const logger = createLogger('CollaborativeSocketServer')
// Enhanced server configuration - HTTP server will be configured with handler after all dependencies are set up
const httpServer = createServer()
const io = createSocketIOServer(httpServer)
// Initialize room manager after io is created
const roomManager = new RoomManager(io)
io.use(authenticateSocket)
const httpHandler = createHttpHandler(roomManager, logger)
httpServer.on('request', httpHandler)
process.on('uncaughtException', (error) => {
logger.error('Uncaught Exception:', error)
// Don't exit in production, just log
})
process.on('unhandledRejection', (reason, promise) => {
logger.error('Unhandled Rejection at:', promise, 'reason:', reason)
})
httpServer.on('error', (error) => {
logger.error('HTTP server error:', error)
})
io.engine.on('connection_error', (err) => {
logger.error('Socket.IO connection error:', {
req: err.req?.url,
code: err.code,
message: err.message,
context: err.context,
})
})
io.on('connection', (socket: AuthenticatedSocket) => {
logger.info(`New socket connection: ${socket.id}`)
setupAllHandlers(socket, roomManager)
})
httpServer.on('request', (req, res) => {
logger.info(`🌐 HTTP Request: ${req.method} ${req.url}`, {
method: req.method,
url: req.url,
userAgent: req.headers['user-agent'],
origin: req.headers.origin,
host: req.headers.host,
timestamp: new Date().toISOString(),
})
})
io.engine.on('connection_error', (err) => {
logger.error('❌ Engine.IO Connection error:', {
code: err.code,
message: err.message,
context: err.context,
req: err.req
? {
url: err.req.url,
method: err.req.method,
headers: err.req.headers,
}
: 'No request object',
})
})
const PORT = Number(env.PORT || env.SOCKET_PORT || 3002)
logger.info('Starting Socket.IO server...', {
port: PORT,
nodeEnv: env.NODE_ENV,
hasDatabase: !!env.DATABASE_URL,
hasAuth: !!env.BETTER_AUTH_SECRET,
})
httpServer.listen(PORT, '0.0.0.0', () => {
logger.info(`Socket.IO server running on port ${PORT}`)
logger.info(`🏥 Health check available at: http://localhost:${PORT}/health`)
})
httpServer.on('error', (error) => {
logger.error('❌ Server failed to start:', error)
process.exit(1)
})
process.on('SIGINT', () => {
logger.info('Shutting down Socket.IO server...')
httpServer.close(() => {
logger.info('Socket.IO server closed')
process.exit(0)
})
})
process.on('SIGTERM', () => {
logger.info('Shutting down Socket.IO server...')
httpServer.close(() => {
logger.info('Socket.IO server closed')
process.exit(0)
})
})