|
|
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(); |
|
|
|