Пространства имен NestJS Dynamic WebSocket

Я использую Nestjs для создания простого приложения, которое слушает несколько пользователей и обрабатывает данные через веб-сокет. Но при трансляции сообщения оно должно идти только назначенному пользователю.

Так что для этого требования, я думаю, идеально подойдут динамические каналы в веб-сокетах. Я копался в динамическом пространстве имен, но не уверен, что оно может решить то, что я делаю сейчас. Я вставляю код, который я сделал до сих пор, но, если возможно, кто-нибудь может посоветовать мне, как сделать то, что я пытаюсь достичь?

Сервер Websocket:

import {
  SubscribeMessage,
  WebSocketGateway,
  OnGatewayConnection, 
  OnGatewayDisconnect,
} from '@nestjs/websockets';
import { EventEmitter } from 'events';
import { Socket } from 'dgram';

@WebSocketGateway(8081, {namespace: "/^support/"})
export class EventsGateway implements OnGatewayConnection, OnGatewayDisconnect {

  name: string = 'Test Server';

  constructor() {
    const emitter = new EventEmitter();
    emitter.setMaxListeners(0);
  }

  clients: number = 0;

  async handleConnection(socket: Socket){
    console.log('server connected......');
    this.clients++;
  }

  async handleDisconnect(socket: Socket){
    console.log('server disconnected......');
    this.clients--;
  }

  @SubscribeMessage('processor')
  async onMessage(client: Socket, data: any): Promise<any> {
    const response = {event: 'processor', data: data, connected: this.clients};
    return response;
  }

}

Код клиента:

import { Controller, Post, Get, Inject, Req, UsePipes, Body, Header } from '@nestjs/common';
import { Request } from 'express';
import * as WebSocket  from 'ws';

@Controller('auth')
export class AuthController {

    static ws: any;

    // Connect WS & Listen to messages
    constructor() {
        this.initWs();     

        AuthController.ws.on('message', function incoming(data: any) {
            console.log(new Date());
            console.log('message recieved');
            console.log(data);
        }); 
    }

    @Get('/generate')
    async generate() {
        return await this.callWs();
    }

    async initWs() {
        AuthController.ws = new WebSocket('ws://localhost:8081');
    }

    // Method to call WS
    async callWs() {    
        // If Socket is not opened, try to re-open..
        if(AuthController.ws.readyState != 1) {
            console.log('Server is dead....');
            this.initWs();
        }

        // If Socket is opened already, then proceed to send message
        console.log('Server is alive....');
        AuthController.ws.send(JSON.stringify({
            event: 'calculate',
            namespace:'00-support',
            data: 5,
        }));
        console.log(new Date());
    }
}

Проблема в том, что если я создаю 2 пространства имен 00-support и 01-support, если я транслирую, оно все равно идет всем клиентам. Но этого не должно быть. Заранее спасибо!

0 ответов

Другие вопросы по тегам