Appearance
Profile Images
Player profile image は PlayerServer 内に保持する immutable asset として扱います。
v1 では me.virmesh.asset.upload の multipart action で画像を直接アップロードし、me.virmesh.player.updateProfile の profile+me.virmesh.player.card module で参照を貼ります。
Flow
me.virmesh.asset.uploadに multipart/form-data で envelope(JSON metadata + 署名)と画像バイナリを同時に送る。- server から
assetIdと検証済み metadata を受け取る。 me.virmesh.player.updateProfileでprofile+me.virmesh.player.cardmodule のimageに asset metadata を設定する。- 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
- v1 の対応形式は
image/pngとimage/jpeg - asset は public-only
- 画像参照は owner 自身の upload 済み asset だけ許可
profile+me.virmesh.player.cardmodule では metadata 一致も検証されるscopeはme.virmesh.player.profileImage
Related Docs
- action: me.virmesh.asset.upload
- action: me.virmesh.player.updateProfile
- action: me.virmesh.player.resolveProfile
- object: obj+me.virmesh.player.profileImage
- transport: Transport