Event Bus

Você já implementou esse padrão em algum projeto? Veja como é interessante e simples. Podemos transformar completamente o comportamento da nossa aplicação!
Imagine ter uma aplicação de grande escala contendo muitas classes interagindo entre si, e você deseja uma maneira de fazer com que essas classes se comuniquem, mantendo os princípios de baixo acoplamento e separação de responsabilidades. O padrão Event Bus pode ser uma excelente solução para o seu problema.
A ideia de um barramento de eventos é bastante semelhante ao barramento estudado em redes (topologia de barramento). Você tem algum tipo de pipeline e computadores conectados a ele, e sempre que um deles envia uma mensagem, ela é despachada para todos os outros. Em seguida, eles decidem se desejam consumir a mensagem fornecida ou apenas descartá-la.

No nível dos componentes, a lógica é bastante semelhante: os computadores são os componentes do seu aplicativo, a mensagem é o evento ou os dados que você deseja comunicar e o pipeline é o seu objeto EventBus.
Agora que temos uma definição do que é um barramento de eventos, vamos colocar a mão na massa e aplicar um exemplo simples de como podemos usá-lo.
Imagine que temos uma aplicação que cadastra usuários e, sempre que um novo usuário é cadastrado no sistema, precisamos realizar algumas ações, como enviar um e-mail ou notificar outros sistemas.
Neste exemplo, vamos exibir no console do terminal os dados publicados no evento.
Utilizaremos o framework NestJS com a seguinte estrutura de projeto:
src/
── common/ # Pacote de arquivos compartilhados
── email-handlers/ # Módulo do serviço que simula o envio de e-mail
── event-bus/ # Módulo do event-bus
── user/ # Módulo de usuário
Para implementar o event-bus em nosso projeto de exemplo, utilizaremos a biblioteca RxJS (Reactive Extensions for JavaScript), conhecida por sua programação reativa em JavaScript. Ela é especialmente útil para lidar com fluxos de eventos assíncronos de maneira simples e declarativa.
Aqui está a implementação do serviço em nosso módulo Event Bus. Nele, teremos os métodos publish e ofType, que nos permitem enviar e receber eventos de forma intuitiva.

Estamos criando nosso primeiro modelo de evento. Este modelo será responsável por garantir que todos os eventos do tipo AccountRegistrationEvent contenham os dados do usuário e o tipo de evento. É importante lembrar que esses campos são totalmente personalizáveis.

Criamos uma rota responsável pelo cadastro de usuários. Cada vez que um usuário é criado, um novo evento é publicado para informar ao sistema sobre os dados desse novo usuário

Agora que estamos publicando eventos, precisamos nos inscrever para poder realizar ações.
Desenvolvemos um módulo chamado email-handlers para simular um serviço de envio de e-mail. Por enquanto, vamos apenas exibir os logs dos eventos para demonstrar que tanto a publicação quanto a inscrição nesses eventos estão funcionando.

A partir de agora, sempre que o evento for recebido, ele será registrado no log, conforme mostrado na imagem abaixo:

A implementação do Event Bus pode ser benéfica para sua base de código, pois ajuda a acoplar livremente suas classes e promove um padrão de publicação-assinatura. Também ajuda os componentes a interagirem sem estarem cientes uns dos outros.
Todos os exemplos de código e implementação podem ser encontrados neste repositório.