1 Managing multiple stream subscriptions in a single connection
tateisu edited this page 2020-12-27 05:53:30 +09:00

Add support for managing multiple stream subscriptions in a single connection https://github.com/tootsuite/mastodon/pull/14524 がMasotodn 3.3.0rc1 に入ったので、STでも対応した。

複数のカラムのストリーム購読指定が同じになる場合がある。

  • たとえばマストドンではホームと通知は同じストリーム購読指定になる
  • たとえばSTはカラムの重複を許可している。

しかしマストドンではサーバ側は同じストリーム購読指定を多重に購読できない。 たとえば { "type": "subscribe", "stream": "user" } をホームと通知に2回購読しても、サーバ側では購読状態は1つしかない。 なのでクライアント側はストリーム購読指定1つにつき購読を1度だけ行い、取得したイベントを各カラムにfan-outする。

StreamSpec

ストリーミング購読指定。

  • タグTLではタグ指定が変わるとストリーム購読指定も変わる。
  • タグTLのany/all/noneなどはストリーム購読指定に含まれない。サーバ側がそれを理解しない。
  • misskey用にChannelIdを持つ。

StreamRelation

購読指定(StreamSpec)と出力先(Column) のペア。

StreamGroup

  • 購読指定(StreamSpec)ひとつと複数の出力先(StreamRelation)。
  • ストリームからイベントを受け取った際、MisskeyならチャネルIDで、マストドンならイベントに記載されたチャネル指定などでフィルタを行う。

StreamConnection

  • ストリーミング接続と購読状態を内部で持つ。

StreamGroupAcct

  • アカウントごとに購読指定をまとめる
  • サーバのバージョンでmultiplexの可否を判定して、接続1つまたは購読指定ごとの接続を使い分ける。

StreamManager

  • ストリーミング接続の全体を管理するクラス。
  • 随時、カラムリストからStreamDestinationを収集してストリーミング接続を更新する。
  • 収集したら アカウント別の StreamGroupAcct / ストリーム購読指定別の (StreamGroupKey) に振り分ける。
  • 収集した結果を 現在の StreamGroupAcct に追加/マージする。
  • StreamGroupAcctごとにupdateConnectionを呼び出す。