RustのaxumでWebsocketを使う際に, サーバが,受信したデータを同じグループに属するクライアントにだけ転送する方法を探してみました.
axum-ws-roomsを使おう!!
あります.パッケージとして公開されているものでは,例えば
axum-ws-rooms
があります.内部でRoom構造体が定義されていて,これが持つ
broadcast
をグループ内のクライアントが購読することで,範囲を限定したブロードキャストが実現されています.
また,1つのセッションで複数のRoomに所属でき,
1つのセッションで複数のRoomに所属している場合,
各Roomが転送してきたメッセージはセッションを管理するプロセス側で1つの
Receiver
でまとめて受け取る仕様になっています.
Cargo.tomlにaxum-ws-rooms = "0.6.0"を追加するだけでライブラリを使うことができます.
ただ,まだcrate.ioの方では公開されていないみたいですが,
Github
の最新のソースではRoomがbroadcast
に使用するデータの型を指定できるようになっているようで,気になるのでこちらを使ってみることにします.
今回は,メッセージに送信者IDを付与して,クライアントが自分から発信したメッセージを受信しないようにしていますが,
broadcastで特定の購読者を無視する方法はあるのでしょうか?
マルチキャストがしたい場合は,HashMapなどを使って自分で実装しないといけない(?)