Как внедрить ConnectedSocket в сервис в NestJS - PullRequest
0 голосов
/ 11 марта 2020

Я хочу добавить @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.

1 Ответ

0 голосов
/ 12 марта 2020

В конце концов, я решил взломать свою собственную «инъекцию зависимости». Поскольку область запроса не является опцией для WebSocketGateway, я решил вручную создать и очистить необходимые службы и сохранить их в клиенте Socket с дополнительным интерфейсом хранилища.

Таким образом, у меня есть ConnectedSocket -область классы, которые могут общаться друг с другом, при этом все еще имея доступ к глобальным инъекциям области действия (которые должны быть вручную переданы всем классам через шлюз).

Данный подход решает все проблемы, сохраняя все dry и синхронно c с идеей, что когда-нибудь ConnectedSocket -области могут быть добавлены к NestJS.

enter image description here

...