Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/yak0/nest-event

Event handling with decorators for NestJS Framework
https://github.com/yak0/nest-event

event-driven-architecture event-driven-programming eventemitter nest nestjs

Last synced: 1 day ago
JSON representation

Event handling with decorators for NestJS Framework

Awesome Lists containing this project

README

        

## 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

```bash
$ npm i --save nest-event
```
### Usage
Import `NestEventModule` into your root module _(`AppModule`)_

```ts
// 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.

```ts
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.
```ts
@Emitter('ws-emitter')
export class WebsocketClient extends Websocket {}
```

#### Event Handler

To adding a listener for an event you can use `@On` decorator.

```ts
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.

```ts
@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`

```ts
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:

```ts
this.nestEventEmitter.emitter('my-emitter').emit('user-created', user);
```

Also, you can get your emitters as StrictEventEmitter

```ts
// define your events
interface Events {
request: (request: Request, response: Response) => void;
done: void;
}
this.nestEventEmitter.strictEmitter().emit('done');
//or
this.nestEventEmitter.strictEmitter('my-emitter').emit('done');
```
### Future Goals

* Add tests;

### Contributing

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

- NestEvent is [MIT licensed](LICENSE).