Пространства имен 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, если я транслирую, оно все равно идет всем клиентам. Но этого не должно быть. Заранее спасибо!