Skip to content

Event Emitter モジュールは、型安全で非同期対応のイベントシステムを提供します。オプションでワイルドカードパターンマッチングを有効にできます。@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(ファイア&フォーゲット)を呼び出します:

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

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

  async placeOrder(order: Order) {
    await this.events.emitAsync("order.created", order);
    return order;
  }
}

イベントのリッスン

任意の @Injectable() プロバイダーのメソッドに @OnEvent() を追加します。モジュールが onApplicationBootstrap 中に自動的にスキャンして登録します。

typescript
import { Injectable } from "nestelia";
import { OnEvent } from "nestelia/event-emitter";

@Injectable()
export class NotificationListener {
  @OnEvent("order.created")
  handleOrderCreated(order: Order) {
    console.log("新規注文:", order.id);
  }

  @OnEvent("order.*")
  handleAnyOrderEvent(order: Order) {
    console.log("注文イベント発火");
  }
}

ワイルドカードパターン

forRootwildcard: true を有効にすると glob スタイルのパターンが使用できます:

パターンマッチ
order.*order.createdorder.shipped
**すべてのイベント

設定オプション

オプションデフォルト説明
wildcardbooleanfalseワイルドカードマッチングを有効化
delimiterstring"."名前空間の区切り文字
maxListenersnumber10イベントごとの最大リスナー数
globalbooleanfalseグローバルモジュールとして登録

エクスポート

エクスポート説明
EventEmitterModuleモジュールクラス
EventEmitterServiceインジェクタブルなイベントエミッターサービス
OnEvent(event, opts?)イベントハンドラーメソッドデコレーター
InjectEventEmitter()パラメーターデコレーターの省略形
EVENT_EMITTER_TOKENインジェクショントークン

MIT ライセンスの下で公開されています。