1.1.16 • Published 4 years ago

nest-async-event v1.1.16

Weekly downloads
32
License
UNLICENSED
Repository
-
Last release
4 years ago

Description

This library inspired by nestjs-event-emitter with the resolution of some flaws and additional features with async and more proper architecture

Installation

npm i -S nest-async-event

Register module

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

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

Listener definition

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

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

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
// 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))
// no wait listeners. Listeners will be add in event loop
this.emitter.emit(new UserCreatedEvent(user))
  • override event emitter
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 {}