Event handler for Nest.js framework with decorators
- Communicate between modules without import
 - Organize event handlers with decorators
 - Work with multiple Event Emitters
 
$ npm i --save nest-eventImport NestEventModule into your root module (AppModule)
// app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { NestEventModule } from 'nest-event';
@Module({
  imports: [NestEventModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}Nest Event is coming with an internal event emitter. If you provide one without a name, the module do not create the internal emitter. Also, you can use any instance with extended from EventEmitter
To provide an emitter use @Emitter decorator.
import { EventEmitter } from 'events';
import { Injectable } from '@nestjs/common';
import { Emitter } from './nest-event';
@Emitter()
export class MyEventEmitter extends EventEmitter {}You can provide multiple emitters with passing a name.
@Emitter('ws-emitter')
export class WebsocketClient extends Websocket {}To adding a listener for an event you can use @On decorator.
import { Injectable } from '@nestjs/common';
import { On } from './nest-event';
import { User } from './interfaces';
@Injectable()
export class EmailService {
  @On('user-created')
  onUserCreated(user: User){
    // send verification email
  }
}If you have multiple emitters you can separate the handlers with @From decorator.
  @From('ws-emitter')
  @On('subscribe')
  onSubscribe(channel: string){
    // do something
  }To access your emitters in different modules, controllers etc. You can use  NestEventEmitter
import { NestEventEmitter } from './nest-event';
@Controller('user')
export class UserController {
  constructor(
    private readonly nestEventEmitter: NestEventEmitter,
    ) {}
  @Post('signup')
  signup() {
    // ...
    this.nestEventEmitter.emit('user-created', user);
  }
}If you provide multiple emitters you can select one with:
 this.nestEventEmitter.emitter('my-emitter').emit('user-created', user);Also, you can get your emitters as StrictEventEmitter
// define your events
 interface Events {
   request: (request: Request, response: Response) => void;
   done: void;
 }
 this.nestEventEmitter.strictEmitter<Events>().emit('done');
 //or
  this.nestEventEmitter.strictEmitter<Events>('my-emitter').emit('done');- Add tests;
 
You are welcome to contribute to this project, just open a PR.
- NestEvent is MIT licensed.