summaryrefslogtreecommitdiff
path: root/server/providers/gateways/ping.gateway.ts
blob: 27fe785435b2ad2f84ae8ca811cd3fb94fd20e16 (plain)
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 { UseGuards } from '@nestjs/common';
import { ConnectedSocket, MessageBody, OnGatewayConnection, OnGatewayDisconnect, OnGatewayInit, SubscribeMessage, WebSocketGateway, WebSocketServer, WsException } from '@nestjs/websockets';
import { GatewayJwtBody } from 'server/decorators/gateway_jwt_body.decorator';
import { JwtBodyDto } from 'server/dto/jwt_body.dto';
import { Server, Socket } from 'socket.io';
import { GatewayAuthGuard } from '../guards/gatewayauth.guard';
import { JwtService } from '../services/jwt.service';

class JoinPayload {
  currentRoom?: string;
  newRoom: string;
}

class PingPayload {
  currentRoom: string;
}

@WebSocketGateway()
@UseGuards(GatewayAuthGuard)
export class PingGateway implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect {
  @WebSocketServer()
  server: Server;

  constructor(private jwtService: JwtService) {}

  afterInit(server: Server) {
    console.log('Sockets initialized');
  }

  handleConnection(client: Socket) {
    // you can do things like add users to rooms
    // or emit events here.
    // IMPORTANT! The GatewayAuthGuard doesn't trigger on these handlers
    // if you need to do anything in this method you need to authenticate the JWT
    // manually.
    try {
      const jwt = client.handshake.auth.token;
      const jwtBody = this.jwtService.parseToken(jwt);
      console.log(client.handshake.query);
      console.log('Client Connected: ', jwtBody.userId);
    } catch (e) {
      throw new WsException('Invalid token');
    }
  }

  handleDisconnect(client: Socket) {
    console.log('Client Disconnected');
  }

  @SubscribeMessage('ping')
  public handlePing(
    @ConnectedSocket() client: Socket,
    @MessageBody() payload: PingPayload,
    @GatewayJwtBody() jwtBody: JwtBodyDto,
  ) {
    this.server.to(payload.currentRoom).emit('pong', { message: { userId: jwtBody.userId } });
    console.log(client.rooms);
  }

  @SubscribeMessage('join-room')
  public async joinRoom(client: Socket, payload: JoinPayload) {
    console.log(payload);
    payload.currentRoom && (await client.leave(payload.currentRoom));
    await client.join(payload.newRoom);
    return { msg: 'Joined room', room: payload.newRoom };
  }
}