import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { Logger } from '@nestjs/common'; import { IoAdapter } from '@nestjs/platform-socket.io'; import { NextFunction, Request } from 'express'; class CustomIoAdapter extends IoAdapter { createIOServer(port: number, options?: any): any { const server = super.createIOServer(port, { ...options, cors: { origin: '*', methods: ['GET', 'POST'], credentials: true, }, allowEIO3: true, transports: ['websocket', 'polling'], }); return server; } } async function bootstrap() { const logger = new Logger('Bootstrap'); const app = await NestFactory.create(AppModule); const expectedToken = process.env.ADMIN_TOKEN || 'admin-token'; // Set global prefix for REST API early so middleware matches the full path const apiPrefix = 'api'; app.setGlobalPrefix(apiPrefix); // Enable CORS for HTTP requests app.enableCors({ origin: '*', methods: ['GET', 'POST', 'DELETE', 'PUT', 'PATCH', 'OPTIONS'], credentials: true, }); app.use(`/${apiPrefix}`, (req: Request, res, next: NextFunction) => { const headerToken = req.headers['x-admin-token'] || req.headers['authorization']; const queryToken = req.query['token']; const token = typeof headerToken === 'string' && headerToken.startsWith('Bearer ') ? headerToken.slice(7) : headerToken || queryToken; if (token === expectedToken) { return next(); } return res.status(401).json({ message: 'Invalid admin token' }); }); app.use("*", (req: Request, _, next: NextFunction) => { console.log(req.method, req.baseUrl) next() }) // Use custom adapter for WebSockets app.useWebSocketAdapter(new CustomIoAdapter(app)); const port = process.env.PORT || 3001; await app.listen(port); logger.log(`Application listening on port ${port}`); } bootstrap();