serverpod-server-events について
Serverpod Server Eventsは、Serverpodサーバー向けの名前付きチャンネルによるメッセージング機能です。サーバー側のイベント処理を構築でき、Redisの有効時にはクラスタ間にも配信できます。
主な機能
- 01名前付きチャンネルへのシリアライズ可能なメッセージ投稿
- 02ローカルまたはグローバルな配信範囲の選択
- 03ストリームによるメッセージ受信
- 04チャンネルリスナーの登録と削除
- 05セッション終了時のリスナー解除
活用シーン
- 01サーバー上でユーザー更新を通知
- 02単一サーバーインスタンス内にイベントを限定
- 03Redisでクラスタ間にイベントを送信
- 04型付きストリームでイベントメッセージを処理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ serverpod/ serverpod --skill serverpod-server-eventsインストール後、Claude Code で/serverpod-server-eventsを入力して読み込まれたか確認します。
詳細
Serverpod サーバーイベント
名前付きチャネルでの、session.messages を介したイベントメッセージングです。メッセージはシリアライズ可能なモデルである必要があります。デフォルト(MessageScope.auto)では、Redis が有効な場合はメッセージがクラスター全体に配信され、無効な場合はサーバーインスタンス内でのみ配信されます。
送信
await session.messages.postMessage('user_updates', UserUpdate(...));
// Restrict delivery with a scope:
await session.messages.postMessage('user_updates', message, scope: MessageScope.local);
await session.messages.postMessage('user_updates', message, scope: MessageScope.global);
MessageScope.local は、このサーバー内でのみ同期的に配信します。MessageScope.global には Redis が必要で、有効になっていない場合は StateError がスローされます。Redis が有効な場合、配信は非同期かつベストエフォートで行われ、リスナーは投稿されたメッセージインスタンスではなく、デシリアライズされたコピーを受け取ります。
受信
ストリーム:
var stream = session.messages.createStream<UserUpdate>('user_updates');
stream.listen((message) => print('Received: $message'));
チャネル上のメッセージが型 T でない場合、ストリームはエラーを出力します。シリアライズ可能な型を正確に指定するか、意図的に共有基底型を使用してください。
リスナー:
session.messages.addListener<UserUpdate>('user_updates', (message) {
print('Received: $message');
});
どちらもローカルメッセージとグローバルメッセージを受信します。ストリームとリスナーは、セッションが閉じると削除されます。手動で削除するには、session.messages.removeListener(channel, callback) を使用してください。モデルは継承をサポートしているため、サーバーイベント用に完全に型付けされたインターフェースを作成する場合に便利です。