公式パッケージ · フレームワーク

NestJS らしく書けるリアルタイムイベント

イベントの送信、デコレーターを付けたプロバイダーのメソッドによるプライベート/プレゼンスチャンネルの認可、署名付き Webhook の受信をまとめたグローバルモジュールです。pusher-js、Laravel Echo、モバイル向け Pusher SDK はそのまま接続できます。

  • HibiraService でイベントの送信、チャンネルやプレゼンスメンバーの取得、サインイン中のユーザーへの送信ができます。
  • @HibiraChannel() は Laravel の routes/channels.php のようにチャンネルを認可し、@Broadcast() はルートの戻り値を送信し、@OnHibiraWebhook() は任意のプロバイダーで Webhook を受け取ります。
  • stream() は LLM の出力をチャンネルへ送り、requestApproval() はコードが動く前に人の承認を求め、HibiraPushService はプッシュ通知を送ります。Nest 10〜12、Express と Fastify に対応。

サインインすると、コード例にご自身のクラスターホストが入ります。 サインイン

  1. インストール

    npm install @hibira-io/nestjs
    
    # .env
    HIBIRA_APP_ID=YOUR_APP_ID
    HIBIRA_KEY=YOUR_APP_KEY
    HIBIRA_SECRET=YOUR_APP_SECRET
    HIBIRA_HOST=ws.hibira.io
  2. 設定する

    // app.module.ts
    import { Module } from '@nestjs/common';
    import { HibiraModule } from '@hibira-io/nestjs';
    import { JwtAuthGuard } from './auth/jwt-auth.guard';
    
    @Module({
      imports: [
        HibiraModule.forRoot({
          auth: { guards: [JwtAuthGuard] }, // POST /hibira/auth
          webhooks: true, // POST /hibira/webhook
        }),
      ],
    })
    export class AppModule {}
  3. 使う

    @Injectable()
    export class OrdersService {
      constructor(private readonly hibira: HibiraService) {}
    
      async ship(order: Order) {
        await this.hibira.trigger(`private-orders.${order.id}`, 'order.shipped', { id: order.id });
      }
    
      @HibiraChannel('private-orders.{orderId}')
      async canSeeOrder(user: User, { orderId }: { orderId: string }) {
        return (await this.find(orderId))?.customerId === user.id;
      }
    }

始める前に

  • アプリのシークレットは、アプリの作成時とシークレットのローテーション時に一度だけ表示されます。サーバーにだけ置き、ブラウザやゲームのビルドには入れないでください。
  • Webhook を受け取るには、main.ts で rawBody: true を指定してアプリを作成してください。署名を受信したバイト列そのもので検証するためです。

ダッシュボードのアプリキーを使ってください。シークレットはサーバー側だけに置きます。チャンネル、イベント、認可エンドポイントは Pusher とまったく同じように動作します。 無料でアカウントを作成 →