# nest-async-event

> [travis-image]: https://api.travis-ci.org/nestjs/nest.svg?branch=master [travis-url]: https://travis-ci.org/nestjs/nest [linux-image]: https://img.shields.io/travis/nestjs/nest/master.svg?label=linux [linux-url]: https://travis-ci.org/nestjs/nest

Latest version **1.1.16** (published 2020-07-17) · UNLICENSED license · 0 weekly downloads

## Install

```sh
npm install nest-async-event
pnpm add nest-async-event
yarn add nest-async-event
bun add nest-async-event
```

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: has types; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.1.16 |
| Published | 2020-07-17 |
| First published | 2020-06-22 |
| Weekly downloads | 0 |
| License | UNLICENSED |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 6 |
| Unpacked size | 450.9 KB |
| Known vulnerabilities | 0 (+3 in 2 direct dependencies) |
| Install scripts | no |
| Maintainers | devsinglesly |

## Links

- npm: https://www.npmjs.com/package/nest-async-event
- npm.io page: https://npm.io/package/nest-async-event

## Dependencies (6)

- [rxjs](https://npm.io/package/rxjs.md) ^6.5.4
- [rimraf](https://npm.io/package/rimraf.md) ^3.0.2
- [@nestjs/core](https://npm.io/package/@nestjs/core.md) ^7.0.0
- [@nestjs/common](https://npm.io/package/@nestjs/common.md) ^7.0.0
- [reflect-metadata](https://npm.io/package/reflect-metadata.md) ^0.1.13
- [@nestjs-plus/discovery](https://npm.io/package/@nestjs-plus/discovery.md) ^2.0.2

## Recent versions

- 1.1.16 (latest) — 2020-07-17
- 1.1.15 — 2020-07-14
- 1.1.11 — 2020-06-25
- 1.1.10 — 2020-06-25
- 1.1.9 — 2020-06-25
- 1.1.7 — 2020-06-22

## README

[travis-image]: https://api.travis-ci.org/nestjs/nest.svg?branch=master
[travis-url]: https://travis-ci.org/nestjs/nest
[linux-image]: https://img.shields.io/travis/nestjs/nest/master.svg?label=linux
[linux-url]: https://travis-ci.org/nestjs/nest
  
  <p align="center">A <a href="http://nodejs.org" target="blank">Node.js</a> library for building efficient and scalable server-side applications<p align="center">

## Description

This library inspired by [nestjs-event-emitter](https://github.com/nestjsx/nest-emitter) 
with the resolution of some flaws and additional features with async 
and more proper architecture

## Installation

```bash
npm i -S nest-async-event
```

## Register module

```typescript
import { NestAsyncEventModule } from "nest-async-event";

@Module({
    imports: [
        NestAsyncEventModule
    ]
})
export class AppModule {}
```

## Listener definition

```typescript
import { ListenerInterface, Listener } from "nest-async-event";
import { UserCreatedEvent } from "@/events/UserCreatedEvent";

@Listener("user.created")
export class UserCreateListener implements ListenerInterface {
    public async listen(event: UserCreatedEvent): Promise<void> {
        // do something with event
        // access to user event.target 
    }
}
```
* Register your listener in `providers`

## Event definition

```typescript
import { EventInterface } from "nest-async-event";
import { User } from "@/entity/User";

export class UserCreatedEvent implements EventInterface {
    public readonly name: string = "user.created";
    
    constructor(
        public readonly target: User
    ) {}
}
```

## Emit event
```typescript
import { EventEmitterInterface, InjectEventEmitter } from "nest-async-event";
import { User } from "@/entity/User";
import { CreateUserDto } from "@/dto/CreateUserDto";
import { UserCreatedEvent } from "@/events/UserCreatedEvent";

export class UserService {
    constructor(
        @InjectEventEmitter() private readonly emitter: EventEmitterInterface
    ) {}
    
    public async create(dto: CreateUserDto): Promise<User> {
        const user = new User(dto.email, dto.password);
        
        await this.emitter.emit(new UserCreatedEvent(user))

        return user;
    }

}
```

## In depth

* async works
```typescript    
// should be wait a listeners of created users event
// you can use it for mutate user object before other operations
await this.emitter.emit(new UserCreatedEvent(user))
```

```typescript
// no wait listeners. Listeners will be add in event loop
this.emitter.emit(new UserCreatedEvent(user))
```

* override event emitter
```typescript
import { EventEmitterInterface } from "nest-async-event"; 
import { NestAsyncEventModule } from "nest-async-event";

export class MyEventEmitter implements EventEmitterInterface {
    // your implementation
}

@Module({
    imports: [
        NestAsyncEventModule.register(new MyEventEmitter())
    ]
})
export class AppModule {}
```

---
_Source: https://npm.io/package/nest-async-event · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
