209 похожих чатов

Import { Logger, UseGuards } from '@nestjs/common'; import { ApiSecurity }

from '@nestjs/swagger';
import { OnGatewayConnection, SubscribeMessage, WebSocketGateway, WsResponse } from '@nestjs/websockets';
import { filter, map, Observable } from 'rxjs';
import { DEVICE_TOKEN_HEADER } from 'src/common/constant';
import { MessagingNotificationEventsEnum } from 'src/messaging/messaging-types/messaging-notification-events.enum';
import { Roles } from 'src/role/role.decorator';
import { RoleGuard } from 'src/role/role.guard';
import { Role } from 'src/role/role.type';
import { CurrentPlayer, CurrentPlayerType } from '../../../auth/auth-decorators/current-player.decorator';
import { NotificationEventDto, NotificationEventType } from '../../messaging-types/notification.dto';
import { MessagingNotificationEventsEventsService } from '../messaging-notification-events-services/messaging-notification-events-events.service';

@WebSocketGateway({
cors: {
origin: '*',
},
path: '/ws/messaging-notifications',
})
export class MessagingNotificationEventsGateway implements OnGatewayConnection {
private readonly logger = new Logger(MessagingNotificationEventsGateway.name);

constructor(private readonly messagingNotificationEventsEventsService: MessagingNotificationEventsEventsService) {}

// eslint-disable-next-line @typescript-eslint/no-explicit-any
handleConnection(client: any, ...args: any[]) {
client.headers = args[0].headers;
}

@ApiSecurity(DEVICE_TOKEN_HEADER)
@UseGuards(RoleGuard)
@Roles(Role.TEST, Role.USER)
@SubscribeMessage(MessagingNotificationEventsEnum.MessagingNotificationEventsStream)
onMessagingNotificationEventsStream(
@CurrentPlayer() player: CurrentPlayerType
): Observable<WsResponse<NotificationEventDto>> {
this.logger.debug(`onMessagingNotificationEventsStream: ${player.id}`);
return this.messagingNotificationEventsEventsService.listenMessagingNotificationEventsStream().pipe(
filter((event) => {
if (
event.type === NotificationEventType.UpdatedNotification &&
!!event.notification?.playerNotificationList.find((v) => v.playerId === player.id)
) {
return true;
}
if (event.type === NotificationEventType.DeletedPlayerNotification && event.playerId === player.id) {
return true;
}
if (event.type === NotificationEventType.DeletedNotification && event.playerId === player.id) {
return true;
}
return false;
}),
map((data) => ({ event: MessagingNotificationEventsEnum.MessagingNotificationEventsStream, data }))
);
}
}

4 ответов

13 просмотров

Тоесть когда в сервис прилетают данные, то сработает эта штука, я правильно же понимаю?

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

IL'shat-Khamitov Автор вопроса
Vincent 🐲 Adler 🇺🇦
Стоп, это же прослушиваем событие какое-то и прове...

народ копит подключения сокетные и птом по этим подключениям ходит и пуляет события, а тут проще, шлем событие в поток, поток при выдаче фильтруется по юзер ид, и не нужно копить людей и по ним ходить

IL'shat Khamitov
народ копит подключения сокетные и птом по этим по...

У меня подключение сокетное одно, других не будет. Максимум ещё одно-два. А вот емитить события я бы хотел с других мест

Похожие вопросы

Карта сайта