コンテンツにスキップ

EventRouter

EventRouter は、イベントタイプ別にハンドラを登録できる EventHandler 実装です。公式 API 仕様には含まれない、SDK 独自の拡張機能です。

追加インストールは不要です。mixi2-js に同梱されています。

// ESM
import { EventRouter } from 'mixi2-js/helpers';
// CJS
const { EventRouter } = require('mixi2-js/helpers');

公式の EventHandler インターフェースは単一の handle メソッドのみを持ちます。イベントが増えると switch 文が肥大化しがちです:

// ❌ switch 文が長くなる
const handler: EventHandler = {
handle: async (event) => {
switch (event.eventType) {
case EventType.POST_CREATED:
// ポスト作成処理...
break;
case EventType.CHAT_MESSAGE_RECEIVED:
// チャット受信処理...
break;
// 今後イベントが増えるたびに case を追加...
}
},
};

EventRouter を使うとイベントごとにハンドラを分離でき、管理しやすくなります:

// ✅ イベントごとに分離
const router = new EventRouter();
router.on(EventType.POST_CREATED, async (event) => {
const post = event.postCreatedEvent?.post;
console.log('ポスト作成:', post?.text);
});
router.on(EventType.CHAT_MESSAGE_RECEIVED, async (event) => {
const message = event.chatMessageReceivedEvent?.message;
console.log('DM 受信:', message?.text);
});
import { OAuth2Authenticator, StreamWatcher, EventType } from 'mixi2-js';
import { EventRouter } from 'mixi2-js/helpers';
const authenticator = new OAuth2Authenticator({
clientId: process.env.CLIENT_ID!,
clientSecret: process.env.CLIENT_SECRET!,
tokenUrl: process.env.TOKEN_URL!,
});
const router = new EventRouter();
router.on(EventType.POST_CREATED, async (event) => {
const post = event.postCreatedEvent?.post;
console.log('ポスト作成:', post?.text);
});
router.on(EventType.CHAT_MESSAGE_RECEIVED, async (event) => {
const message = event.chatMessageReceivedEvent?.message;
console.log('DM 受信:', message?.text);
});
const watcher = new StreamWatcher({
streamAddress: process.env.STREAM_ADDRESS!,
authenticator,
});
await watcher.watch(router);
import { WebhookServer } from 'mixi2-js';
import { EventRouter } from 'mixi2-js/helpers';
const router = new EventRouter();
router.on(EventType.POST_CREATED, async (event) => {
// ...
});
const server = new WebhookServer({
port: 8080,
publicKey: Buffer.from(process.env.SIGNATURE_PUBLIC_KEY!, 'base64'),
handler: router,
});
await server.start();
new EventRouter()

引数なしで作成します。EventHandler インターフェースを実装しています。

メソッド戻り値説明
on(eventType, listener)thisイベントタイプに対するリスナーを登録
off(eventType, listener?)thisリスナーを削除
handle(event)Promise<void>登録されたリスナーにイベントをルーティング

指定したイベントタイプに対するリスナーを登録します。

router.on(EventType.POST_CREATED, async (event) => {
// ポスト作成時の処理
});
  • 同じイベントタイプに複数のリスナーを登録可能
  • リスナーは登録順に逐次実行されます(並列ではない)
  • メソッドチェーン対応(this を返す)
router
.on(EventType.POST_CREATED, handler1)
.on(EventType.POST_CREATED, handler2)
.on(EventType.CHAT_MESSAGE_RECEIVED, handler3);

リスナーを削除します。

// 特定のリスナーを削除
router.off(EventType.POST_CREATED, myListener);
// そのイベントタイプの全リスナーを削除
router.off(EventType.POST_CREATED);
  • listener を指定した場合: そのリスナーのみを削除
  • listener を省略した場合: 指定したイベントタイプの全リスナーを削除
  • メソッドチェーン対応

EventHandler インターフェースの実装です。通常は直接呼び出す必要はありません。StreamWatcher.watch()WebhookServer が自動的に呼び出します。

  • 登録されたリスナーが存在しないイベントタイプは無視されます
  • 複数のリスナーが登録されている場合、登録順に逐次実行されます
type EventListener = (event: Event) => void | Promise<void>;

EventListenerEvent を受け取り、void または Promise<void> を返す関数です。同期・非同期のどちらでも使えます。

import { OAuth2Authenticator, Client, StreamWatcher, EventType } from 'mixi2-js';
import { EventRouter } from 'mixi2-js/helpers';
const authenticator = new OAuth2Authenticator({
clientId: process.env.CLIENT_ID!,
clientSecret: process.env.CLIENT_SECRET!,
tokenUrl: process.env.TOKEN_URL!,
});
const client = new Client({
apiAddress: process.env.API_ADDRESS!,
authenticator,
});
const router = new EventRouter();
// メンション・リプライにエコー返信
router.on(EventType.POST_CREATED, async (event) => {
const post = event.postCreatedEvent?.post;
if (post?.text) {
await client.createPost({
text: post.text,
inReplyToPostId: post.id,
});
}
});
// DM にエコー返信
router.on(EventType.CHAT_MESSAGE_RECEIVED, async (event) => {
const message = event.chatMessageReceivedEvent?.message;
if (message?.text) {
await client.sendChatMessage({
roomId: message.roomId!,
text: message.text,
});
}
});
const watcher = new StreamWatcher({
streamAddress: process.env.STREAM_ADDRESS!,
authenticator,
});
await watcher.watch(router);