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-event
Import 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.