Я хочу добавить @ConnectedSocket
в гнездо js, предоставляющее интерфейс для генерации событий. Цель довольно ясна - избежать вызова emit с необработанным именем события и any
данными. SocketFacadeHost
ниже приведен пример такого сервиса.
Пока что единственный способ, которым я мог придумать, - это заменить каждый вызов emit упаковкой сокета фабрикой сервисов фасада - SocketFacade
.
socket.facade.ts
class SocketFacadeHost {
constructor(private client: Socket) { }
syncDSL(dsl: CoreDSL): void {
this.client.emit('syncDSL', dsl);
}
}
export const SocketFacade = (client: Socket) => new SocketFacadeHost(client);
socket.gateway.ts
...
@SubscribeMessage('bind')
async bindEnvironment(
@MessageBody() data: BindingDTO,
@ConnectedSocket() client: Socket,
): Promise<void> {
const { pageUUID } = data;
const page = await this.pagesService.getByUUID(pageUUID);
SocketFacade(client).syncDSL(page.coreDSL);
}
Но это все еще своего рода хаки sh , Любой простой способ сделать это?
Что-то вроде расширения @ConnectedSocket
декоратор или WebSocketGateway
?
--- Edit 1 ---
После прохождения тонны Документация, примеры и вопросы по теме. Я считаю, что проблема заключается в том, чтобы сделать сервис осведомленным о контексте, который по умолчанию некорректен. Таким образом, охранники, перехватчики, каналы и все декораторы ExecutionContext работают только на уровне контроллера / шлюза. Служба должна быть либо без сохранения состояния, либо создаваться во всех экземплярах при каждом вызове (который контролируется областью @Injectable).
Так что мой подход к использованию фабрики фасадов в порядке.
Но опять же, было бы удобно, если бы была возможность «заменить» декоратор @ConnectedSocket () декоратором, который возвращает обернутый сокет с интерфейсом, который не будет путаться с чистым mvc.