Skip to content

コア概念

English | 한국어 | 日本語

ActivityPlug は、クライアント API が異なるサーバに対して TypeScript・ HTTP・GraphQL・ブラウザ向けの統一契約を提供します。以下の概念は、 ポータビリティが及ぶ範囲とサーバ固有の動作が残る範囲を定義します。

アダプタ

アダプタは ActivityPlugAdapter を実装します。メタデータとして安定した ID、表示名、アダプタ種別、認識するソフトウェアファミリ、静的な capability 判定を提供します。オプションの操作グループは、インスタンス、 アカウント、投稿、タイムライン、検索、メディア、投票、ソーシャル、通知、 リスト、フォローリクエスト、フィルタ、予約投稿、ブックマークフォルダ、 ストリーミングの動作を実装します。

アダプタ ID はすべての公開エンティティ ID とページカーソルの一部です。 変更すると、以前のバージョンで作成された参照が壊れます。製品固有のアダプタは、実際に API 契約をマッピングしていないソフトウェア との互換性を主張してはいけません。

インスタンスと origin

インスタンスとは、Fediverse サーバソフトウェアの個々の配備を指します。 ActivityPlug は https://social.example のような正規 origin で インスタンスを選択します。パス、クエリ、フラグメント、埋め込まれた認証 情報はインスタンス識別子ではありません。

ライブラリクライアントは 1 つのアダプタを 1 つの origin にバインドします。 サーバリクエストにはアダプタと origin のセレクタが含まれるため、単一の ActivityPlug サーバから複数のソフトウェアファミリと配備を対象にできます。

インスタンス検出では NodeInfo、OAuth メタデータ、製品固有のインスタンス エンドポイント、明示的な機能プローブを組み合わせられます。検出リンクは 選択したインスタンスの origin 内に収める必要があります。リモートアクセス には設定済みの origin ポリシとネットワークポリシも適用されます。

セッション

AuthSessionAuthSessionStore の背後に保存された認証情報を指す公開 オブジェクトです。セッション ID、アダプタ、origin、認証方式、スコープ、 capability メタデータ、オプションのアカウント情報と有効期限を記録します。 保存されたアクセストークンやリフレッシュトークンは公開しません。

セッションは発行元のアダプタと origin にバインドされます。別のクライアント ターゲットにセッションを渡すと認証に失敗します。対応する方式は OAuth、 インポートしたトークン、メールチャレンジ、パスキーですが、各アダプタは 自身が実装した方式だけを通知します。

コアパッケージはデフォルトでインメモリの認証ストアと credential リース ストアを使います。サーバには、ブラウザセッション、OAuth state、短期 キャッシュ、ストリームチケット用の追加ストアがあります。再起動後や複数 レプリカ間での継続性が必要な本番配備では、適切な永続性と共有特性を備えた ストアを設定してください。

Capability

capability とはポータブルな動作に対する名前付き判定です。たとえば posts.updatestreaming.notifications があります。状態は次の とおりです。

  • supported: 選択したアダプタと既知のインスタンス契約がその動作を サポートします。
  • unsupported: その動作が利用できない、またはマッピングされていない ことが判明しています。
  • unknown: 得られた根拠ではサポートの有無を確定できません。

判定には理由、ソフトウェアバージョンの制約、受け付ける入力、メディアの 制限を含められます。ActivityPlug は静的なアダプタメタデータ、NodeInfo、 OAuth メタデータ、インスタンスメタデータ、プローブの順に根拠レイヤを マージします。より具体的なレイヤが先行する判定を上書きできます。

capability の確認は UI ヒントではなく、操作上の契約です。クライアント サービスは、契約で許可されていないリクエストを送信せず、必須 capability が unsupported または unknown であれば操作を拒否します。サーバや バージョンによって動作が変わる場合は、実行時に判定を確認してください。

エンティティ参照と不透明 ID

正規化されたエンティティには以下の要素を持つ EntityRef が含まれます。

  • id: ポータブルな不透明 ID。
  • type: 正規化されたエンティティ型。
  • adapterorigin: エンティティを所有するターゲット。
  • rawId: アダプタ固有の識別子。
  • オプションの rawUrl: リモートリソースの URL。

不透明 ID はアダプタ、origin、エンティティ型、raw ID をバージョン付き エンベロープにエンコードします。分割できない単一の公開値として扱って ください。クライアントはアダプタを呼び出す前に不透明 ID をデコード・ 検証し、別のアダプタ・origin・エンティティ型の参照を拒否します。 rawId は診断や明示的なアダプタ相互運用にのみ使ってください。

正規化されたエンティティはリモートの生データ raw と名前付き extensions も公開できます。これらのフィールドはポータブル契約の対象外 です。

ページとカーソル

リスト操作は nodespageInfo を持つ Connection<Node> を返します。 PageInputafterbeforelimit を受け付けます。ActivityPlug は PORTABLE_PAGE_LIMIT を超える正の limit を 100 に制限します。

ActivityPlug のカーソルはリモートカーソルをアダプタ、origin、公開操作に バインドします。カーソルを別のタイムライン、操作、アダプタ、インスタンス で再利用できません。アダプタはエンティティ ID からカーソルを生成せず、 リモート API の正確なカーソルを保持する必要があります。リモート エンドポイントが信頼できる continuation セマンティクスを提供できない場合、 アダプタはカーソル入力を拒否するか、該当する continuation 値を省略する 必要があります。

エラー

ポータブルな失敗は ActivityPlugError を使います。code が失敗を 分類し、context がアダプタ、origin、操作、capability、リモートの 詳細を識別します。一般的なカテゴリには検証、認証、未対応の動作、リモート プロトコルエラー、ネットワーク障害、origin ポリシ拒否、リクエスト上限の 超過があります。

code で分岐する前に isActivityPlugError() を使ってください。 メッセージ文字列をパースしてはいけません。UNSUPPORTED_OPERATION は明示的な結果であり、null で代替しないで ください。呼び出し元がサポートされている動作またはターゲットを選ぶ必要 があります。

リモート権限

すべてのリモート操作は RemoteAuthority を経由します。 RemoteAuthority はリクエストを送信先と公開操作にバインドし、credential が origin や表現を越えて送信されるかどうかを制御します。同一 origin への credential 送信は権限に設定された表現に応じて許可 されます。origin をまたぐ credential 送信には、方向を明示した完全一致の 許可が必要です。

ライブラリユーザはリモート I/O の前に権限を明示的に指定する必要が あります。サーバは origin 検査、DNS ピンニング、プライベートネットワーク 制御、リクエスト予算、レスポンス制限を備えた審査済み Node.js 権限を構築 します。ブラウザコードでは createBrowserRemoteAuthority() を使って ブラウザの fetch 境界を明示的に有効にできます。

次のステップ

Apache-2.0 OR MIT ライセンスで配布します。