Вызвать событие веб-сокета из класса обслуживания в NestJS
Привет, ребята, я новичок в NestJs. Пожалуйста, помогите мне. Я пытаюсь отправить событие всем аффилированным лицам всякий раз, когда создается новый запрос. Но я не знаю, как мне получить доступ к EventsGateway в классе RequestService и создать событие оттуда. Вот код
events.gateway.ts
import {
MessageBody,
SubscribeMessage,
WebSocketGateway,
WebSocketServer,
WsResponse,
ConnectedSocket
} from '@nestjs/websockets';
import { from, Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { Server, Socket } from 'socket.io';
@WebSocketGateway()
export class EventsGateway {
@WebSocketServer()
private server: Server;
public usersBySocketId: Object = {};
public usersById: Object = {};
@SubscribeMessage("user logged in")
async findAll(@MessageBody() data: any,
@ConnectedSocket() socket: Socket,
): Promise<Observable<WsResponse<number>>> {
this.usersBySocketId[socket.id] = data;
this.usersBySocketId[socket.id]["socket"] = socket;
this.usersById[data.id] = data;
this.usersById[data.id]['socketId'] = socket.id;
return from([1, 2, 3]).pipe(map(item => ({ event: 'events', data: item })));
}
handleDisconnect(socket: Socket) {
if (this.usersBySocketId[socket.id]) {
const userId = this.usersBySocketId[socket.id].userId;
delete this.usersBySocketId[socket.id];
delete this.usersById[userId];
}
}
}
events.module.ts
import { Module } from '@nestjs/common';
import { EventsGateway } from './events.gateway';
@Module({
imports: [],
providers: [
EventsGateway,
],
})
export class EventsModule { }
request.service.ts
import { Request, Affiliate } from '../lib/index';
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { RequestDto } from './request.dto';
import { BaseService } from '../lib/base.service';
@Injectable()
export class RequestService extends BaseService {
constructor(
@InjectModel('request') public readonly requestModel: Model<Request>,
@InjectModel('Affiliate') public readonly affiliateModel: Model<Affiliate>,
) {
super();
}
async createRequest(data: RequestDto): Promise<string> {
try {
const newRequest = new this.requestModel(data);
const result = await newRequest.save();
// get affiliates which provices service in data.zip
const affiliates = await this.affiliateModel.find({
areaServices: { $in: [data.zip] }
}).populate('businessOwner');
// get access to userById and socket of EventsGateway somehow and find affilates socket IDs from userById
/***
const socketIds = affiliates
.filter(affiliate => {
if(userById[affiliate.id]) {
return true;
} else return false;
})
.map(affilate => {
return userById[affiliate.id][socketId]
})
socket.to(socketIds).emit("new request created");
***/
return result;
}
catch (err) {
throw err;
}
}
}