| | 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'; |
| |
|
| | |
| | const apiPrefix = 'api'; |
| | app.setGlobalPrefix(apiPrefix); |
| |
|
| | |
| | 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() |
| | }) |
| |
|
| | |
| | app.useWebSocketAdapter(new CustomIoAdapter(app)); |
| |
|
| |
|
| | const port = process.env.PORT || 3001; |
| | await app.listen(port); |
| | logger.log(`Application listening on port ${port}`); |
| | } |
| |
|
| | bootstrap(); |
| |
|