All files / src/events events.gateway.ts

82.14% Statements 23/28
62.5% Branches 5/8
100% Functions 8/8
80.76% Lines 21/26

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 68 69 70 7123x           23x 23x               23x       23x   6x       2x         2x       6x       6x       6x           6x 6x 6x       6x 6x           10x 10x 10x 7x 6x          
import {
  OnGatewayConnection,
  OnGatewayDisconnect,
  WebSocketGateway,
  WebSocketServer,
} from '@nestjs/websockets';
import { Server, WebSocket } from 'ws';
import { Logger, OnApplicationShutdown } from '@nestjs/common';
import { WebSocketEvent } from './websocket.events';
 
@WebSocketGateway({
  cors: {
    origin: '*',
  },
})
export class EventsGateway
  implements OnGatewayConnection, OnGatewayDisconnect, OnApplicationShutdown
{
  @WebSocketServer()
  server: Server;
 
  private readonly logger = new Logger(EventsGateway.name);
 
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  handleConnection(client: WebSocket) {
    this.logger.log('Client connected to WebSocket');
  }
 
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  handleDisconnect(client: WebSocket) {
    this.logger.log('Client disconnected from WebSocket');
  }
 
  async onApplicationShutdown(signal?: string) {
    this.logger.log(
      `Shutting down WebSocket gateway on signal: ${signal || 'N/A'}`,
    );
 
    Iif (!this.server) {
      return;
    }
 
    for (const client of this.server.clients) {
      Iif (client.readyState === WebSocket.OPEN) {
        client.terminate();
      }
    }
 
    await new Promise<void>((resolve, reject) => {
      this.server.close((err) => {
        Iif (err && err.message !== 'The server is not running') {
          this.logger.error('Error closing WebSocket server:', err);
          return reject(err);
        }
        this.logger.log('WebSocket server closed or was not running.');
        resolve();
      });
    });
  }
 
  sendToAll<E extends WebSocketEvent>(event: E['event'], data: E['data']) {
    const message = JSON.stringify({ event, data });
    this.logger.log(`Broadcasting WebSocket event '${event}'`);
    this.server.clients.forEach((client) => {
      if (client.readyState === WebSocket.OPEN) {
        client.send(message);
      }
    });
  }
}