メッセージング API
メッセージング API は、同じストーリー内で動いている複数のスクリプト同士の通信を可能にします。スクリプト間で挙動を協調させたり、データを共有したりできます。
メッセージの種類
送信できるメッセージは 2 種類です。
- ダイレクトメッセージ:スクリプト ID を指定して特定スクリプトへ送信
- ブロードキャストメッセージ:待ち受けている全スクリプトへ送信
メッセージを送る
特定スクリプトへ送信
api.v1.messaging.send に相手スクリプトの ID とデータを渡します。
await api.v1.messaging.send('target-script-id', {
type: 'greeting',
text: 'Hello from another script!'
});
メッセージデータは、シリアライズ可能なオブジェクトなら何でも構いません(関数を含むものや循環参照のあるオブジェクトは送れません)。
全スクリプトへブロードキャスト
api.v1.messaging.broadcast を使います。
await api.v1.messaging.broadcast({
type: 'notification',
event: 'generation-complete',
timestamp: Date.now()
});
メッセージハンドラを登録しているスクリプトは、全てブロードキャストを受信します。
メッセージを受け取る
ハンドラの登録
受信するには api.v1.messaging.onMessage でハンドラを登録します。
let unsubscribe = api.v1.messaging.onMessage((message) => {
api.v1.log(`Received message from ${message.fromScriptId}: ${JSON.stringify(message)}`);
if (message.data.type === 'greeting') {
api.v1.log(`Greeting message: ${message.data.text}`);
}
});
ハンドラには、メッセージデータ、送信元のスクリプト ID などを含む message オブジェクトが渡されます。
受信を停止する(購読解除)
onMessage は購読 ID(subscription index)を返します。後で unsubscribe して受信を止められます。
let unsubId = await api.v1.messaging.onMessage((message) => {
// Handle message
});
// Later, when you want to stop receiving messages:
api.v1.messaging.unsubscribe(unsubId)
スクリプト ID を知る
特定スクリプトへ送るには相手の ID が必要です。自分自身の ID は api.v1.script.id で取得できます。
api.v1.log(`My script ID: ${api.v1.script.id}`);
ID のハードコードは変更に弱いためおすすめしません。代替として、ブロードキャストで動的に発見する方式が便利です。
参考
- ストレージ API - スクリプト間データ共有の別手段
- API リファレンス - API 全体(英語)