イベントバスは、強力なパブリッシュ/サブスクライブメカニズムを提供します。これにより、Blocklet内のさまざまなコンポーネントや、異なるBlocklet間(同じABT Nodeインスタンス内)であっても、疎結合な方法で相互に通信できます。これは、コンポーネント同士が直接的な依存関係を持つことなく、システム全体の状態変化やイベントをブロードキャストするのに理想的です。
通知サービスがユーザーにターゲットを絞ったメッセージを送信するために設計されているのに対し、イベントバスは内部のコンポーネント間通信のために設計されています。
仕組み
イベントバスは、非同期な通信フローを促進します:
- パブリッシャーコンポーネントが、特定の名前とペイロードを持つイベントを送信します。
- Blocklet SDKは、このイベントをABT Nodeで実行されている中央のイベントバスサービスに送信します。
- イベントバスサービスは、そのイベントタイプをリッスンしているすべてのサブスクライバーコンポーネントにこのイベントをブロードキャストします。
このプロセスは以下の図で視覚化されています:

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フィールドは、フィルタリングを容易にするためにトップレベルのイベントオブジェクトに昇格されます。
- id
例
ユーザー作成イベントのパブリッシュ
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— 更新イベントの場合、変更前のオブジェクトの状態が含まれることがあります。
- type
例
イベントのサブスクライブ
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に渡されたものと全く同じコールバック関数の参照。
例
適切にサブスクライブを解除するには、元のコールバック関数への参照を保持する必要があります。
完全なサブスクリプションライフサイクル
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('ユーザーイベントのサブスクライブを解除しました。');