Skip to content

Модуль Event Emitter предоставляет типобезопасную, асинхронную систему событий с опциональной поддержкой wildcard-паттернов. Методы, отмеченные @OnEvent(), автоматически обнаруживаются и регистрируются при старте приложения — никакой ручной регистрации не требуется.

Установка

Дополнительные зависимости не нужны — модуль включён в nestelia.

Настройка

typescript
import { Module } from "nestelia";
import { EventEmitterModule } from "nestelia/event-emitter";

@Module({
  imports: [
    EventEmitterModule.forRoot({
      wildcard: true,  // включить паттерны "order.*" и "**"
      global: true,    // EventEmitterService доступен везде
    }),
  ],
})
export class AppModule {}

Отправка событий

Инжектируйте EventEmitterService и вызывайте emitAsync (ожидает все обработчики) или emit (fire-and-forget):

typescript
import { Injectable } from "nestelia";
import { EventEmitterService } from "nestelia/event-emitter";
import type { Order } from "./order.schema";

@Injectable()
export class OrdersService {
  constructor(private readonly events: EventEmitterService) {}

  async placeOrder(order: Order) {
    // ... сохранение заказа ...
    await this.events.emitAsync("order.created", order);
    return order;
  }
}

@InjectEventEmitter()

Сокращение для @Inject(EVENT_EMITTER_TOKEN):

typescript
import { Injectable } from "nestelia";
import { InjectEventEmitter, EventEmitterService } from "nestelia/event-emitter";

@Injectable()
export class NotificationService {
  constructor(
    @InjectEventEmitter() private readonly events: EventEmitterService,
  ) {}
}

Прослушивание событий

Добавьте @OnEvent() к любому методу любого @Injectable()-провайдера. Модуль сканирует все провайдеры во время onApplicationBootstrap и регистрирует обработчики автоматически.

typescript
import { Injectable } from "nestelia";
import { OnEvent } from "nestelia/event-emitter";
import type { Order } from "./order.schema";

@Injectable()
export class NotificationListener {
  @OnEvent("order.created")
  handleOrderCreated(order: Order) {
    console.log("Новый заказ:", order.id);
  }

  @OnEvent("order.shipped")
  handleOrderShipped(order: Order) {
    console.log("Заказ отправлен:", order.id);
  }
}

Зарегистрируйте listener-класс как provider в нужном модуле:

typescript
@Module({ providers: [NotificationListener] })
export class OrdersModule {}

Одноразовые обработчики

typescript
@OnEvent("app.initialized", { once: true })
onAppReady(payload: unknown) {
  console.log("Приложение готово");
}

Wildcard-паттерны

Включите wildcard: true в forRoot для использования glob-паттернов:

ПаттернСовпадает с
order.*order.created, order.shipped, …
**.createdorder.created, user.created, …
**каждое событие
typescript
@Injectable()
export class AuditListener {
  @OnEvent("order.*")
  logOrderEvent(order: Order) {
    console.log("Аудит:", order.id);
  }

  @OnEvent("**")
  logAll(payload: unknown) {
    console.log("Событие:", payload);
  }
}

Конфигурация

EventEmitterModuleOptions

ОпцияТипПо умолчаниюОписание
wildcardbooleanfalseВключить wildcard-паттерны * / **
delimiterstring"."Разделитель пространств имён
maxListenersnumber10Максимум обработчиков на событие
globalbooleanfalseЗарегистрировать как глобальный модуль

API EventEmitterService

МетодСигнатураОписание
emit(event, payload?) → booleanОтправить событие без ожидания
emitAsync(event, payload?) → Promise<unknown[]>Отправить и дождаться всех обработчиков
on(event, handler) → thisЗарегистрировать постоянный обработчик
once(event, handler) → thisЗарегистрировать одноразовый обработчик
off(event, handler?) → thisУдалить обработчик
removeAllListeners(event?) → thisУдалить все обработчики
listenerCount(event) → numberКоличество зарегистрированных обработчиков

Экспорты

ЭкспортОписание
EventEmitterModuleКласс модуля
EventEmitterServiceИнжектируемый сервис эмиттера
OnEvent(event, opts?)Декоратор метода для обработчиков
InjectEventEmitter()Сокращённый декоратор параметра
EVENT_EMITTER_TOKENТокен инжекции
EventEmitterModuleOptionsИнтерфейс опций

Распространяется по лицензии MIT.