File size: 1,936 Bytes
d988ae4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3bbb98d
 
 
 
 
d988ae4
 
 
 
 
 
 
3bbb98d
 
 
 
 
 
 
 
 
 
 
 
 
 
d988ae4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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();