Friendica のメッセージフロー

ここでは、Friendica ネットワーク上で、あるユーザーからほかのユーザーへメッセージがどのようにして送られるかについて、いくらか詳しく説明します。実際には複数の経路があり、複数のプロトコルとメッセージ形式が使われます。

ここで説明するメッセージフローを理解するには、(少なくとも) DFRN プロトコルのドキュメント (http://dfrn.org/dfrn.pdf) を読み、OStatus スタックのうちメッセージをやり取りする要素 (salmon および Pubsubhubbub) について知っている必要があります。

メッセージのやり取りのほとんどに関与するのはファイル include/items.php で、このファイルにはフィード関連のインポート/エクスポートを行うための各種関数が用意されています。

メッセージが投稿されると、include/notifier.php によって、すべてのネットワークに対し、ただちにすべての配信が行われます。メッセージをどのように (そして誰に) 配信するかは include/notifier.php が選択します。include/notifier.php は、DFRN-notify を含むすべての配信のローカルサイドも処理します。

mod/dfrn_notify.php は DFRN-notify のリモートサイドを処理します。

ローカルフィードは mod/dfrn_poll.php によって生成され、これが DFRN-poll プロトコルのリモートサイドも処理します。

Salmon 通知は mod/salmon.php を介して到着します。

プッシュ (pubsubhubbub) フィードは mod/pubsub.php を介して到着します。

DFRN-poll フィードインポートは、スケジュールされたタスクとして include/poller.php を介して到着します。これが DFRN-poll プロトコルのローカルサイドを実装しています。

シナリオ 1: Bob が公開の近況メッセージを投稿します。

これは相手のいない公開メッセージなので、プライベートなトランスポートは一切使われません。メッセージが取りうる経路は 2 つあります。1 つは DFRN クライアントを対象とした bbcode による経路で、メッセージは HTML に変換され、サーバーの PuSH (pubsubhubbub) ハブに通知されます。PuSH ハブが動作している場合、dfrn-poll クライアントは PuSH チャネルを優先的に使用して情報を受け取ります。ハブに配信の問題がある場合 (デフォルトの Google リファレンスハブを使っている場合、問題の発生は珍しくありません)、dfrn-poll クライアントは毎日ポーリングを行う方法へとフォールバックします。ハブが指定されていない場合、DFRN クライアントは最大 5 分間隔で (コンタクトごとに) 構成可能な頻度でポーリングを行います。dfrn-poll 経由で取得されたフィードは bbcode で、該当する poller の側に表示できるアクセス権があれば、プライベートな会話が含まれることもあります。

シナリオ 2: Jack が Bob の公開メッセージにリプライします。Jack は Friendica/DFRN ネットワーク上にいます。

Jack は dfrn-notify を使って Bob にダイレクトリプライを送信します。Bob はこれを受けて会話のフィードを作成し、その会話に関係している全員に対して dfrn-notify を使ってフィードを送信します。PuSH ハブは、新しいコンテンツが利用可能になったという通知を受け取ります。ハブは最新のフィードを取得し、これをハブのすべての登録者 (異なるネットワーク上にいることもあります) に転送します。

シナリオ 3: Mary が Bob の公開メッセージにリプライします。Mary は Friendica/DFRN ネットワーク上にいます。

Mary は dfrn-notify を使って Bob にダイレクトリプライを送信します。Bob はこれを受けて会話のフィードを作成し、その会話に関係している全員に対して dfrn-notify を使ってフィードを送信します (Bob 自身を除き、会話は Jack と Mary の両方に送信されます)。メッセージは dfrn-notify を使って送信されます。PuSH ハブも、新しいコンテンツが利用可能になったという通知を受け取ります。ハブは最新のフィードを取得し、これをハブのすべての登録者 (異なるネットワーク上にいることもあります) に転送します。

シナリオ 4: William が Bob の公開メッセージにリプライします。William は OStatus ネットワーク上にいます。

William は salmon を使ってリプライを Bob に通知します。コンテンツは salmon マジックエンベロープに埋め込まれた HTML です。Bob はこれを受けて会話のフィードを作成し、その会話に関係しているすべての Friendica メンバーに対して dfrn-notify を使ってフィードを送信します (Bob 自身を除き、会話は Jack と Mary の両方に送信されます)。PuSH ハブは、新しいコンテンツが利用可能になったという通知を受け取ります。ハブは最新のフィードを取得し、これをハブのすべての登録者 (異なるネットワーク上にいることもあります) に転送します。

シナリオ 5: Bob が Mary と Jack 宛のプライベートなメッセージを投稿します。

メッセージは dfrn_notify を使ってただちに Mary と Jack に配信されます。公開ハブには通知されません。タイムアウトした場合は、キューに入れ直されます。このメッセージに対するリプライも、公開リプライと同じフローをたどりますが、ハブには通知されず、メッセージが公開フィードに現れることがない点が異なります。会話の全体は、Mary と Jack の dfrn-poll のパーソナライズされたフィードによって、この二人にも見えるようになります (ただし、それ以外の人は見ることはできません)。