iii-realtime-streams について
iii engine でリアルタイムストリームを構築するためのスキルです。ストリーム項目の管理や、WebSocket 経由で接続クライアントへイベントを送る方法を扱い、カスタムアダプターと複数言語の実装例を備えています。
主な機能
- 01ストリーム項目の CRUD
- 02ストリームグループへのイベント送信
- 03カスタムストリームアダプター
- 04WebSocket によるリアルタイム配信
- 05複数言語の実装例
活用シーン
- 01チャットメッセージのライブ更新
- 02ユーザーやルームごとのストリーム分割
- 03状態変更後のイベント送信
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ iii-hq/ skills --skill iii-realtime-streamsインストール後、Claude Code で/iii-realtime-streamsを入力して読み込まれたか確認します。
詳細
リアルタイムストリーム
類似サービス:Socket.io、Pusher、Firebase Realtime
主な概念
タスクに該当する場合は、以下の概念を使用してください。すべてのストリーム設定で、これらすべてが必要になるわけではありません。
- StreamModule はポート 3112 で WebSocket 接続を提供します
- クライアントは
ws://host:3112/stream/{stream_name}/{group_id}に接続します - stream::set/stream::get/stream::list/stream::delete は、ストリーム項目の CRUD 操作を提供します
- stream::send は、ストリームグループ内のすべての接続済みクライアントにイベントをプッシュします
createStreamは、デフォルト以外のストリームバックエンド用にカスタムアダプターを登録します- 各ストリーム項目は、
stream_name、group_id、item_id、dataで指定します
アーキテクチャ
Function
→ trigger('stream::set', { stream_name, group_id, item_id, data })
→ trigger('stream::send', { stream_name, group_id, data })
→ StreamModule
→ WebSocket プッシュ
→ /stream/{stream_name}/{group_id} に接続済みのクライアント
使用する iii プリミティブ
| プリミティブ | 目的 |
|---|---|
trigger({ function_id: 'stream::set', payload }) | ストリーム項目を作成または更新する |
trigger({ function_id: 'stream::get', payload }) | ストリーム項目を読み取る |
trigger({ function_id: 'stream::list', payload }) | ストリームグループ内の項目を一覧表示する |
trigger({ function_id: 'stream::delete', payload }) | ストリーム項目を削除する |
trigger({ function_id: 'stream::send', payload }) | 接続済みクライアントにイベントをプッシュする |
createStream | カスタムストリームアダプターを登録する |
リファレンス実装
完全に動作する例については、../references/realtime-streams.js を参照してください。WebSocket クライアントにライブ更新をプッシュし、CRUD 操作でストリーム項目を管理するストリームの例です。
Python 版もあります:../references/realtime-streams.py
Rust 版もあります:../references/realtime-streams.rs
よくあるパターン
このパターンを使用するコードには、該当する場合、通常以下が含まれます。
registerWorker(url, { workerName })— ワーカーの初期化trigger({ function_id: 'stream::set', payload: { stream_name, group_id, item_id, data } })— ストリーム項目を書き込むtrigger({ function_id: 'stream::send', payload: { stream_name, group_id, data } })— クライアントにイベントをプッシュするtrigger({ function_id: 'stream::get', payload: { stream_name, group_id, item_id } })— ストリーム項目を読み取るtrigger({ function_id: 'stream::list', payload: { stream_name, group_id } })— グループ内の項目を一覧表示するcreateStream(name, adapter)— 特殊なバックエンド用のカスタムアダプターconst logger = new Logger()— 構造化ログ
このパターンの応用
タスクに該当する場合は、以下の応用方法を使用してください。
- ドメインに合わせてストリームに名前を付けます(例:
chat-messages、dashboard-metrics、notifications) group_idを使用して、ユーザー、ルーム、テナントごとにストリームを分割しますiii-state-reactionsと組み合わせ、状態が変化するたびにストリームイベントをプッシュします- デフォルトのアダプターが適さない場合(例:カスタムの永続化やファンアウトのロジック)は、
createStreamを使用します
エンジン設定
StreamModule を使用するには、ポートとアダプター(KvStore または Redis)を指定して iii-config.yaml で有効にする必要があります。注釈付きの設定リファレンス全体については、../references/iii-config.yaml を参照してください。
パターンの適用範囲
- タスクがリアルタイムプッシュを伴わない永続的なキー値データに関するものであれば、
iii-state-managementを優先してください。 - タスクで状態変化に応じたリアクティブなトリガー(サーバーサイド)が必要であれば、
iii-state-reactionsを優先してください。 - 主な要件が接続済みクライアントへのライブ更新のプッシュであれば、
iii-realtime-streamsを使用してください。
使用する場面
- タスクの主な対象が iii エンジンの
iii-realtime-streamsである場合に、このスキルを使用します。 - リクエストで、このパターンまたは同等の実装が明確に求められている場合に適用されます。
適用範囲
- 無関係なタスクに対する汎用的な代替手段として、このスキルを使用しないでください。
- より具体的な iii スキルが適している場合、このスキルを適用してはいけません。
- このスキルの例を適用する前に、環境と安全性の制約を必ず確認してください。
コメント
Markdown 対応