メインコンテンツへスキップ

イベントバス

イベントバスは、強力なパブリッシュ/サブスクライブメカニズムを提供します。これにより、Blocklet内のさまざまなコンポーネントや、異なるBlocklet間(同じABT Nodeインスタンス内)であっても、疎結合な方法で相互に通信できます。これは、コンポーネント同士が直接的な依存関係を持つことなく、システム全体の状態変化やイベントをブロードキャストするのに理想的です。

通知サービスがユーザーにターゲットを絞ったメッセージを送信するために設計されているのに対し、イベントバスは内部のコンポーネント間通信のために設計されています。

仕組み

イベントバスは、非同期な通信フローを促進します:

  1. パブリッシャーコンポーネントが、特定の名前とペイロードを持つイベントを送信します。
  2. Blocklet SDKは、このイベントをABT Nodeで実行されている中央のイベントバスサービスに送信します。
  3. イベントバスサービスは、そのイベントタイプをリッスンしているすべてのサブスクライバーコンポーネントにこのイベントをブロードキャストします。

このプロセスは以下の図で視覚化されています:

Event Bus

APIリファレンス

publish

イベントをイベントバスにパブリッシュし、サブスクライブしているすべてのリスナーが利用できるようにします。これは非同期操作です。

パラメータ

  • name string (required) — イベントの名前。例:user.created または order.shipped。
  • event object (required) — イベントの詳細を含むオブジェクト。
    • id string — イベントの一意のID。指定しない場合、自動的に生成されます。
    • time string — イベントが発生したときのISO 8601タイムスタンプ。デフォルトは現在時刻です。
    • data object (required) — イベントのメインペイロード。JSONシリアライズ可能な任意のデータを含めることができます。このオブジェクトのobject_typeおよびobject_idフィールドは、フィルタリングを容易にするためにトップレベルのイベントオブジェクトに昇格されます。

ユーザー作成イベントのパブリッシュ

javascript
import eventbus from '@blocklet/sdk/service/eventbus';

async function createUser(userData) {
  // ... ユーザーをデータベースに作成するロジック
  const newUser = { id: 'user_123', name: 'John Doe' };

  try {
    await eventbus.publish('user.created', {
      data: {
        object_type: 'User',
        object_id: newUser.id,
        object: newUser,
        source_system: 'admin_panel',
      },
    });
    console.log('ユーザー作成イベントが正常にパブリッシュされました。');
  } catch (error) {
    console.error('イベントのパブリッシュに失敗しました:', error);
  }

  return newUser;
}

subscribe

イベントバスからイベントを受信するたびに実行されるコールバック関数を登録します。コンポーネントは自身がパブリッシュしたイベントを受信しないことに注意してください。

パラメータ

  • cb (event: TEvent) => void (required) — イベントが受信されたときにイベントオブジェクトを引数として呼び出されるコールバック関数。

イベントオブジェクトの構造 (TEvent)

コールバック関数は、単一の引数であるイベントオブジェクトを受け取ります。このオブジェクトは、CloudEvents仕様に基づいた標準化された構造を持っています。

  • id string (required) — イベントインスタンスの一意の識別子。
  • source string (required) — イベントをパブリッシュしたコンポーネントのDID。
  • type string (required) — イベントの名前(例:user.created)。
  • time string (required) — イベントが作成されたときのISO 8601タイムスタンプ。
  • spec_version string (required) — CloudEvents仕様のバージョン。例:'1.0.0'。
  • object_type string — イベントデータのプライマリオブジェクトのタイプ(例:User)。
  • object_id string — イベントデータのプライマリオブジェクトのID。
  • data object (required) — イベントの詳細なペイロード。
    • type string — データのコンテンツタイプ。デフォルトは'application/json'です。
    • object any — 実際のデータペイロード。
    • previous_attributes any — 更新イベントの場合、変更前のオブジェクトの状態が含まれることがあります。

イベントのサブスクライブ

javascript
import eventbus from '@blocklet/sdk/service/eventbus';

const handleEvent = (event) => {
  console.log(`受信したイベントのタイプ: ${event.type}`);
  console.log('イベント詳細:', event);

  if (event.type === 'user.created') {
    console.log(`ID: ${event.object_id} の新しいユーザーが作成されました`);
    // UIを更新するか、他のアクションを実行する
  }
};

eventbus.subscribe(handleEvent);

console.log('イベントバスからのイベントをリッスンしています...');

unsubscribe

以前に登録されたイベントリスナーを削除します。メモリリークを防ぐために、コンポーネントがアンマウントされるときや、イベントのリッスンが不要になったときに、この関数を呼び出すことが重要です。

パラメータ

  • cb (event: TEvent) => void (required) — subscribeに渡されたものと全く同じコールバック関数の参照。

適切にサブスクライブを解除するには、元のコールバック関数への参照を保持する必要があります。

完全なサブスクリプションライフサイクル

javascript
import eventbus from '@blocklet/sdk/service/eventbus';

// 1. ハンドラ関数を定義する
const onUserEvent = (event) => {
  console.log(`ユーザーイベントを受信しました: ${event.type}`);
};

// 2. イベントバスをサブスクライブする
eventbus.subscribe(onUserEvent);
console.log('ユーザーイベントをサブスクライブしました。');

// ... アプリケーションのライフサイクルの後半で(例:コンポーネントのアンマウント時)

// 3. 同じ関数参照を使用してサブスクライブを解除する
eventbus.unsubscribe(onUserEvent);
console.log('ユーザーイベントのサブスクライブを解除しました。');