clip / apps /backend /src /main.ts
Poki01
Require admin token for private access
3bbb98d
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();