import express from 'express'; import cors from 'cors'; import helmet from 'helmet'; import compression from 'compression'; import { createServer } from 'http'; import { Server } from 'socket.io'; import dotenv from 'dotenv'; import { Logger } from './utils/logger'; import { NowhereCore } from './core/nowhere'; import { setupRoutes } from './routes'; import { setupWebSocket } from './websocket'; import { errorHandler } from './middleware/error-handler'; import { rateLimiter } from './middleware/rate-limiter'; // Load environment variables dotenv.config(); const app = express(); const server = createServer(app); const io = new Server(server, { cors: { origin: process.env.FRONTEND_URL || "*", methods: ["GET", "POST", "PUT", "DELETE"], credentials: true } }); const logger = new Logger('Server'); const PORT = process.env.PORT || 3001; // Initialize Nowhere Core const nowhere = new NowhereCore(); // Security middleware app.use(helmet({ contentSecurityPolicy: { directives: { defaultSrc: ["'self'"], styleSrc: ["'self'", "'unsafe-inline'"], scriptSrc: ["'self'"], imgSrc: ["'self'", "data:", "https:"], }, }, })); // Compression middleware app.use(compression()); // CORS middleware app.use(cors({ origin: process.env.FRONTEND_URL || "*", credentials: true, methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With'] })); // Body parsing middleware app.use(express.json({ limit: '10mb' })); app.use(express.urlencoded({ extended: true, limit: '10mb' })); // Rate limiting app.use(rateLimiter); // Health check endpoint app.get('/health', (req, res) => { res.json({ status: 'ok', message: 'Nowhere AI Agent Backend is running', timestamp: new Date().toISOString(), version: '2.0.0', environment: process.env.NODE_ENV || 'development' }); }); // Setup API routes setupRoutes(app, nowhere); // Setup WebSocket setupWebSocket(io, nowhere); // Error handling middleware (must be last) app.use(errorHandler); // Graceful shutdown process.on('SIGTERM', async () => { logger.info('SIGTERM received, shutting down gracefully'); await nowhere.close(); server.close(() => { logger.info('Server closed'); process.exit(0); }); }); process.on('SIGINT', async () => { logger.info('SIGINT received, shutting down gracefully'); await nowhere.close(); server.close(() => { logger.info('Server closed'); process.exit(0); }); }); // Start server server.listen(PORT, () => { logger.info(`🚀 Nowhere AI Agent Backend running on port ${PORT}`); logger.info(`📊 Health check: http://localhost:${PORT}/health`); logger.info(`🔧 API status: http://localhost:${PORT}/api/v1/status`); logger.info(`💬 WebSocket: ws://localhost:${PORT}`); logger.info(`🌍 Environment: ${process.env.NODE_ENV || 'development'}`); // Log available features logger.info('✅ Features enabled:', { voiceCommands: true, autopilotMode: true, memorySystem: true, realTimeCommunication: true, advancedAIProcessing: true, multiModelSupport: true, security: true, logging: true }); }); // Handle uncaught exceptions process.on('uncaughtException', (error) => { logger.error('Uncaught Exception', { error: error.message, stack: error.stack }); process.exit(1); }); process.on('unhandledRejection', (reason, promise) => { logger.error('Unhandled Rejection', { reason, promise }); process.exit(1); }); export { app, server, io, nowhere };