Skip to content

Profile Images

Player profile image は PlayerServer 内に保持する immutable asset として扱います。

v1 では me.virmesh.asset.upload の multipart action で画像を直接アップロードし、me.virmesh.player.updateProfileprofile+me.virmesh.player.card module で参照を貼ります。

Flow

  1. me.virmesh.asset.upload に multipart/form-data で envelope(JSON metadata + 署名)と画像バイナリを同時に送る。
  2. server から assetId と検証済み metadata を受け取る。
  3. me.virmesh.player.updateProfileprofile+me.virmesh.player.card module の image に asset metadata を設定する。
  4. public profile 取得後、handle.record.playerServer + /profile-images/:assetId から画像を読む。

Multipart Upload Action

me.virmesh.asset.upload は private action で、Content-Type: multipart/form-data を使います。

Request

POST /private/me.virmesh.asset.upload
Content-Type: multipart/form-data; boundary=----Boundary

------Boundary
Content-Disposition: form-data; name="envelope"
Content-Type: application/json

{
  "from": "medi:player:ed25519:base64-public-key",
  "payload": {
    "scope": "me.virmesh.player.profileImage",
    "contentType": "image/png",
    "size": 42000,
    "hash": "sha256:base64url-hash",
    "width": 512,
    "height": 512
  },
  "signature": "base64-signature-of-envelope"
}

------Boundary
Content-Disposition: form-data; name="file"; filename="profile.png"
Content-Type: image/png

<raw binary bytes>

------Boundary--

envelope 部分は通常の private action と同じ JSON 構造を持ちます。signature は canonical JSON of { action, from, payload } に対する対象 player 本人の署名です。

server は次を検証します。

  • envelope 署名の検証
  • payload の metadata と受信した file の一致(size、hash)
  • scope に応じた contentType とサイズ上限のチェック

Response

成功時は shared status envelope で応答します。

json
{
  "status": "status+me.virmesh.success.assetUploaded",
  "payload": {
    "assetId": "profimg_123",
    "scope": "me.virmesh.player.profileImage",
    "contentType": "image/png",
    "hash": "sha256:base64url-hash",
    "size": 42000,
    "width": 512,
    "height": 512
  }
}

Public Fetch Route

保存済み asset は public route から取得します。

text
GET /profile-images/:assetId

この route は immutable asset を返します。レスポンスの Content-Type は保存済み metadata に従います。

profile payload には URL が入らないため、client は me.virmesh.player.resolveProfile で得た handle.record.playerServer を使って取得 URL を組み立てます。

text
{handle.record.playerServer}/profile-images/{assetId}

Constraints