Skip to content

Server Federation

PlayerServer 間のリクエスト転送プロトコルを定義します。

VirMesh v1 では、プレイヤーは自分が所属する 1 つの PlayerServer を介して他サーバー上のプレイヤーと通信します。クライアントは常に自分の PlayerServer に action を送り、自分の PlayerServer が必要に応じて対象プレイヤーの PlayerServer にリクエストを転送します。

転送フロー

  1. クライアントが自分の PlayerServer(以下「送信元 PS」)に private action を送る。
  2. 送信元 PS は payload 内の対象 player identifier(例:payload.friendId)から対象の PlayerServer(以下「送信先 PS」)を解決する。
  3. 送信元 PS はクライアントの envelope をそのまま送信先 PS に POST する。
  4. 送信先 PS は署名を検証し、処理結果を送信元 PS に返す。
  5. 送信元 PS は結果をクライアントに返す。

転送リクエスト形式

転送リクエストはクライアントの envelope を一切変更せず、HTTP ヘッダーで転送情報を付与します。

text
POST https://target-ps.example.com/private/me.virmesh.social.sendFriendRequest
X-VirMesh-Forwarded-By: https://sender-ps.example.com
Content-Type: application/json

{
  "from": "medi:player:ed25519:sender-public-key",
  "payload": {
    "requestTo": "medi:player:ed25519:recipient-public-key",
    "friendPayload": {
      "playerA": "medi:player:ed25519:sender-public-key",
      "playerB": "medi:player:ed25519:recipient-public-key"
    },
    "senderSignature": "base64-signature-by-sender"
  },
  "signature": "base64-signature-by-sender-for-envelope"
}

転送ヘッダー

ヘッダー必須説明
X-VirMesh-Forwarded-By推奨転送元 PlayerServer の canonical URL

v1 では X-VirMesh-Forwarded-By は検証の参考情報です。受信側は envelope の signature(プレイヤー署名)のみで正当性を判断します。

対象 PlayerServer の解決

送信元 PS は対象プレイヤーの PlayerServer を次のいずれかの方法で解決します。

  1. handle 経由: 対象プレイヤーの handle(例:alice@example.com)から me.virmesh.handle.resolveHandle を呼び、handle record 内の playerServer を取得する。
  2. profile 経由: me.virmesh.player.resolveProfile の response payload.handle.record.playerServer から取得する。
  3. 直接指定: クライアントがあらかじめ対象の PlayerServer URL を知っている場合。

handle は player 専用です。ワールドの discovery では example.com/world 形式の world address を使い、me.virmesh.world.resolveWorld で署名付き world manifest と worldId に解決します。解決後の instance 取得や live session の署名対象には、world address ではなく worldId を使います。

転送対象の action

v1 では以下の social action が転送対象です。

action説明
me.virmesh.social.sendFriendRequest対象プレイヤーの PS に friend request を転送
me.virmesh.social.acceptFriendRequest相手の PS に受理を通知
me.virmesh.social.declineFriendRequest相手の PS に拒否を転送
me.virmesh.social.cancelFriendRequest相手の PS にキャンセルを通知
me.virmesh.social.removeFriend相手の PS にフレンド解除を通知

エラーハンドリング

送信先 PS が返したエラーは、送信元 PS がそのままクライアントに転送します。

送信先 PS に到達できない場合、送信元 PS は適切なエラーをクライアントに返します(v1 ではサーバー実装依存)。

Next steps

  • transport の詳細は Transport を参照してください。
  • social action の詳細は me.virmesh.social を参照してください。