Skip to content
Event handling with decorators for NestJS Framework
TypeScript Shell
Branch: master
Clone or download
Latest commit cb9b614 Nov 15, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src StrictEventEmitter added Nov 15, 2019
test initial commit Nov 4, 2019
.gitignore update .gitignore and remove lib folder Nov 4, 2019
.npmignore initial commit Nov 4, 2019
.prettierrc initial commit Nov 4, 2019
.travis.yml Update .travis.yml Nov 5, 2019
LICENSE Initial commit Nov 4, 2019
README.md StrictEventEmitter added Nov 15, 2019
build.sh initial commit Nov 4, 2019
package-lock.json StrictEventEmitter added Nov 15, 2019
package.json StrictEventEmitter added Nov 15, 2019
tsconfig.json initial commit Nov 4, 2019
tslint.json initial commit Nov 4, 2019

README.md

Nest Event

NPM Version Package License NPM Downloads Travis

Event handler for Nest.js framework with decorators

Features

  • Communicate between modules without import
  • Organize event handlers with decorators
  • Work with multiple Event Emitters

Installation

$ npm i --save nest-event

Usage

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 {}

Event Handler

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
  }

Event Emitter

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');

Future Goals

  • Add tests;

Contributing

You are welcome to contribute to this project, just open a PR.

License

You can’t perform that action at this time.