Skip to content

Note

このドキュメントは2026-02-27 02:25PLaMo Translation Modelを使用して自動翻訳されました。

FEP-fffd: プロキシオブジェクト仕様

概要

プロキシオブジェクトとは、[ActivityPub]規格に準拠したオブジェクトでありながら、別のプロトコル(必ずしもActivityPubではない)上に存在する他のエンティティと意味的に同一であるオブジェクトを指す。例えば、ActivityPubからNostrへのブリッジでは、Nostrユーザーやノートを代理するActorおよびNoteがプロキシオブジェクトとして作成される。

本文書は、プロキシオブジェクトを識別するためのデータ形式と、それらが対応するActivityPubおよび非ActivityPubエンティティを指定する方法について規定する。この仕様の目的は、マルチプロトコル対応クライアントが自動的にプロキシオブジェクトとその元となる実体を統合し、ブリッジやプロトコル横断的な公開に関する実装詳細をユーザーから隠蔽できるようにすることである。

1. 要件

「MUST」「SHOULD」「MAY」といったキーワードについては、[RFC2119]で定義された解釈に従うものとする。

2. 技術的根拠

本節は規範的ではない記述を含む。

Fediverseに参加する多くのサーバーは、ActivityPub以外にもNostrやDiasporaなど複数のプロトコルをサポートしており、これらのプロトコル間で同時に投稿を公開している。さらに、ActivityPubと他のプロトコル(例えばNostr)間の投稿中継を行うブリッジサーバーも存在する。

また、ActivityPubオブジェクトの複製を作成するユースケースも存在する:アカウントを別インスタンスに移行する場合である。新しいアカウントにコピーされた投稿は、元の投稿と重複関係にあることを示す必要があり、その際に元の投稿が持つ「いいね」や「リプライ」情報を保持する仕組みが求められる。

これらの利用ケースが存在するにもかかわらず、現在ActivityPubアクティビティが他のプロトコル上の投稿のコピー(あるいはプロキシ)である旨を標準的に伝達する方法は存在しない。

以下のシナリオを想定してほしい:

  • アリスのサーバーはActivityPubとDiasporaの両プロトコルに対応している。彼女は両方のプロトコルでシンジケートされる投稿を公開する。
  • ボブのサーバーはActivityPubのみに対応している。彼はアリスのActivityPub版投稿にリプライを送る。
  • チャーリーのサーバーはDiasporaのみに対応している。彼はAliceのDiaspora版投稿にリプライを送る。
  • DeeのサーバーはActivityPubとDiasporaの両方に対応している。彼女はアリス、ボブ、チャーリーの各投稿を受信するが、DeeのサーバーはどのようにすればBobのリプライとCharlieのリプライが同じ投稿に属することを認識できるだろうか?

プロキシオブジェクトはこの問題を解決する可能性のある解決策を提供する。

3. データ形式

FEP-fffdでは新たな語彙や@contextエントリは定義しない。代わりに、Objectのurlプロパティにおいてrel属性が"alternate"または"canonical"である場合のLinkの意味をさらに明確に規定する。

url内に"rel": "alternate"または"rel": "canonical"を持つ各Linkをプロキシリンクと呼ぶ。1つ以上のプロキシリンクを含むObjectはプロキシオブジェクトと定義される。プロキシリンクが参照する対象をプロキシ対象オブジェクトと呼び、これは4節で説明される制約事項を除き、親となるプロキシオブジェクトと意味的に同一であると見なされるべきである。

プロキシ対象オブジェクトは、必ずしもActivityPubオブジェクトである必要はなく、ネットワークリクエストによってアクセス可能なオブジェクトでもない。その意味内容はプロトコルに基づいて決定される。プロキシ対象オブジェクトのプロトコルおよびフォーマットはプロキシリンクのURIスキームとmediaTypeによって定義され、既知のプロトコルやデフォルト値は5節で規定する。アプリケーションは、そのアプリケーションが理解できないプロトコルやフォーマットによるプロキシ対象オブジェクトは無視すべきである。

もしプロキシリンクに"rel": "canonical"が含まれている場合、それはそのプロキシ対象オブジェクトが正規版(オリジナルかつ権威ある)バージョンであることを示す。プロキシオブジェクトは複数の"rel": "canonical"を持つプロキシリンクを1つ以上含んではならない。このプロパティは、第三者による投稿を中継するブリッジサーバーにおいて、橋渡しされた投稿が元の投稿ではないことを示すために使用されるべきである。複数プロトコルに同時に公開を行うサーバーがこのプロパティを使用することは適切ではない。この場合、どのバージョンのオブジェクトも他より権威があるとは言えないからである。

4. 統合処理

準拠アプリケーションがプロキシオブジェクトに遭遇した場合、特定の条件下でそれとそのプロキシ対象オブジェクトを統合することができる。

プロキシオブジェクトとプロキシ対象オブジェクトを統合するとは、これらすべてのオブジェクトを単一のエンティティ(ユーザーや投稿など)として表示するとともに、それらに属する全てのコレクション情報とメタデータを結合することを意味する:

  • アクターが存在する場合、そのフォロワー、フォロー中リスト、「いいね」済みアイテム、および送信待ちメッセージのコレクションは、プロキシ統合時に組み合わせるべきである
  • 非アクターオブジェクトの場合、存在するリプライ、いいね、シェア情報をプロキシオブジェクトのものと組み合わせるべきである
  • 統合対象のいずれかが正規版である場合、そのプロパティは他の統合オブジェクトと競合する場合には優先されるべきである
  • 統合対象のいずれにも正規版がない場合、アプリケーションは任意の方法で競合するプロパティを解決してよい。その解決方法としては、例えば機能豊富なプロトコルから取得した表現を選択する、競合状況について詳細な説明を表示する、あるいはプロパティに矛盾のあるオブジェクトの統合を拒否するなどが含まれる

特定の状況下では、アプリケーションが不正な形式のプロキシリンクや、作成者が所有していないオブジェクトを誤認させるようなプロキシリンクに遭遇したり、参照先が不正または欠落しているプロキシリンクに遭遇することがある。このような場合、統合処理が妨げられる可能性がある。

  • プロキシリンクの参照先が無効である場合、そのプロキシリンクは無視されるべきである。
  • canonicalプロキシリンクが同時に唯一のurlエントリでもある場合、それは元の投稿へのクリック可能なリンクとしても使用されるべきである。

第三者が運営するTwitterからActivityPubへのブリッジによって中継された投稿。canonicalプロキシリンクが唯一のurlエントリであるため、これは元の投稿へのリンクとしてクリック可能に表示すべきである。

{
  "id": "http://twitter-bridge.example/status/1234",
  "type": "Note",
  "actor": "http://twitter-bridge.example/@jack",
  "content": "just setting up my twttr",
  "url": {
    "type": "Link",
    "rel": "canonical",
    "href": "https://twitter.com/jack/status/20"
  }
}

ActivityPub、Diaspora、およびNostrに同時に公開された投稿。url内に1つの非プロキシLinkが存在し、そのプロトコルがhttpsであるため、この非プロキシリンクは元の投稿へのリンクとしてクリック可能に表示すべきである。

{
  "id": "http://fediverse.example/status/1234",
  "type": "Note",
  "actor": "http://fediverse.example/@alice",
  "content": "Hello, world!",
  "url": [{
    "type": "Link",
    "href": "https://fediverse.example/@alice/1234"
  }, {
    "type": "Link",
    "rel": "alternate",
    "href": "diaspora://alice@fediverse.example/post/deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"
  }, {
    "type": "Link",
    "rel": "alternate",
    "href": "nostr:note1gwdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"
  }]
}

アカウント移行時にユーザーの旧インスタンスから新インスタンスへコピーされたActivityPubノート。

{
  "id": "http://newinstance.example/status/1234",
  "type": "Note",
  "actor": "http://newinstance.example/@alice",
  "content": "Hello, world!",
  "url": [{
    "type": "Link",
    "href": "https://newinstance.example/@alice/1234"
  }, {
    "type": "Link",
    "rel": "canonical",
    "mediaType": "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"",
    "href": "https://oldinstance.example/status/5678"
  }]
}

参考文献

著作権

CC0 1.0 Universal(CC0 1.0)パブリックドメイン献呈

本Fediverse拡張提案の著者らは、法律で許容される範囲内において、この著作物に関するすべての著作権および関連する権利を放棄している。