Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
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: 2 months ago
JSON representation
Event handling with decorators for NestJS Framework
- Host: GitHub
- URL: https://github.com/yak0/nest-event
- Owner: yak0
- License: mit
- Created: 2019-11-04T23:27:23.000Z (about 5 years ago)
- Default Branch: master
- Last Pushed: 2023-05-10T22:18:10.000Z (over 1 year ago)
- Last Synced: 2024-09-29T01:41:34.302Z (2 months ago)
- Topics: event-driven-architecture, event-driven-programming, eventemitter, nest, nestjs
- Language: TypeScript
- Homepage: https://twitter.com/jsdragonsdev
- Size: 815 KB
- Stars: 149
- Watchers: 11
- Forks: 7
- Open Issues: 12
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-nestjs - Nest Event - 使用 NestJS 框架的装饰器进行事件处理。 (资源 / 组件和库)
README
## Nest Event
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.tsimport { 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 EmitterTo 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).