95 lines
2.3 KiB
Markdown
95 lines
2.3 KiB
Markdown
---
|
|
sidebar_position: 8
|
|
---
|
|
|
|
# Message Bus API
|
|
|
|
The plugin message bus sends plugin-only P2P events. It can also include bounded latest-message snapshots for plugins that coordinate around recent chat state.
|
|
|
|
## Required Capabilities
|
|
|
|
| Method | Capability |
|
|
| --- | --- |
|
|
| `messageBus.publish(request)` | `events.p2p.publish`, plus `messages.read` if `includeLatestMessages` is true |
|
|
| `messageBus.sendLatestMessages(request?)` | `events.p2p.publish` and `messages.read` |
|
|
| `messageBus.subscribe(subscription)` | `events.p2p.subscribe`, plus `messages.read` if replaying latest messages |
|
|
|
|
## Subscribe
|
|
|
|
```js
|
|
export function activate(context) {
|
|
context.subscriptions.push(context.api.messageBus.subscribe({
|
|
topic: 'poll:votes',
|
|
channelId: 'general',
|
|
replayLatest: true,
|
|
latestMessageLimit: 10,
|
|
handler: (event) => {
|
|
context.api.logger.info('Poll bus event', {
|
|
topic: event.topic,
|
|
choice: event.payload?.choice,
|
|
messageCount: event.messages?.length ?? 0
|
|
});
|
|
}
|
|
}));
|
|
}
|
|
```
|
|
|
|
## Publish
|
|
|
|
```js
|
|
export function activate(context) {
|
|
const envelope = context.api.messageBus.publish({
|
|
topic: 'poll:votes',
|
|
channelId: 'general',
|
|
payload: {
|
|
pollId: 'raid-night-2026-04-29',
|
|
choice: 'healer',
|
|
voter: 'Alice'
|
|
},
|
|
includeLatestMessages: true,
|
|
includeSelf: true,
|
|
latestMessageLimit: 10,
|
|
sinceTimestamp: 1777470000000
|
|
});
|
|
|
|
context.api.logger.info('Published poll event', { eventId: envelope.eventId });
|
|
}
|
|
```
|
|
|
|
Example envelope:
|
|
|
|
```json
|
|
{
|
|
"eventId": "plugin-bus-1777473600000-1",
|
|
"pluginId": "example.polls",
|
|
"roomId": "room-7ebdde75",
|
|
"channelId": "general",
|
|
"topic": "poll:votes",
|
|
"sentAt": 1777473600000,
|
|
"payload": {
|
|
"pollId": "raid-night-2026-04-29",
|
|
"choice": "healer",
|
|
"voter": "Alice"
|
|
},
|
|
"messages": [
|
|
{ "id": "msg-1", "content": "Raid tonight?", "channelId": "general" }
|
|
]
|
|
}
|
|
```
|
|
|
|
## Send Latest Messages
|
|
|
|
```js
|
|
export function activate(context) {
|
|
context.api.messageBus.sendLatestMessages({
|
|
topic: 'chat:snapshot',
|
|
channelId: 'support',
|
|
limit: 25,
|
|
includeDeleted: false,
|
|
sinceTimestamp: 1777460000000,
|
|
targetPeerId: 'peer-muse-laptop'
|
|
});
|
|
}
|
|
```
|
|
|
|
Use the message bus for plugin coordination. Do not use it for normal user chat messages; use `messages.send()` for that. |