User:Kisaragi marine/record: Difference between revisions

From Resonite Wiki
Created page with "## 前提 プラットフォームを管理しているものを「システム」と呼ぶ。 ???のとき、システム全体で一意となる識別子が付番される[実装依存: `M-`から始まることが多い]。本ドキュメントではこれを「MID」と呼ぶ。 MIDが付与されているエンティティは「MA」と呼ぶ。 ユーザー、グループ、あるいはMAを総称して「所有権表明エンティティ」と呼ぶ。..."
 
clean up
Line 1: Line 1:
## 前提
== 用語 ==


プラットフォームを管理しているものを「システム」と呼ぶ。
1. プラットフォームを管理しているものを「システム」と呼ぶ。システム全体で一意となる識別子が付番される<ref group="注">実装依存: `M-`から始まることが多い</ref>。本ドキュメントではこれを「MID」と呼ぶ。
2. MIDが付与されているエンティティを「MA」と呼ぶ。
3. ユーザー、グループ、あるいはMAを総称して「所有権表明エンティティ」と呼ぶ。
4. システムによって管理されている有向グラフで、各項目の所有者が何らかの所有権表明エンティティとなっているオブジェクトストレージを「インベントリ」と呼ぶ。
5. インベントリの最上のディレクトリであり、親ディレクトリがないディレクトリを「(その)インベントリのルート」と呼ぶ。
6. インベントリにあるオブジェクトを「レコード」と呼ぶ。
7. レコードに付与される識別子を「レコードID」と呼ぶ。システム全体で一意となる識別子が付番される<ref group="注">これは `R-`から始まり、その直後にUUIDv4として解釈できる文字列が続くことが***多い***が常時ではないのであてにするべきではない</ref>。
8. ユーザーがシステムにログインしたときに生成される推測不可能な文字列を「ローカルマシントークン」と呼ぶ。コンピューターごとによって異なる[未検証]識別子が付番される。
9. ユーザーが作成されたときに付与される識別子を、「ユーザーID」と呼ぶ。システム全体で一意となる識別子が付番される。<ref group="注">実装依存: `U-`から始まることが多い。前プラットフォームからマイグレーションされたユーザーはその後にユーザー名の空白を`-`で置換した文字列が続くことが多いが、ユーザーネームに日本語が使われている場合など反例があるため仮定するのは危険。Resonite内で作成されたユーザーはプレフィクスのあとにUUIDv4として解釈できる文字列が続くことがほとんど。 [https://www.notion.so/Resonite-ID-8e610c06fd214fba94bb9573000acbd8?pvs=21 Resoniteで新しく作ったユーザーのIDはランダムになるっぽい]も参照せよ</ref>
10. グループが作成されたときに付与される識別子を「グループID」と呼ぶ。システム全体で一意となる識別子が付番される<ref group="注">実装依存: `G-`から始まることが多い</ref>。
11. レコードに内部的につけられ、相対パスのコンポーネントとして使用される文字列を「RecordName」と呼ぶ。実際に表示されるレコードの名前とは異なる場合がある。特に、[[Things_to_Avoid#Inventory|インベントリUI上で表示されるラベル]]にRTFを使用している場合は一致しない[未検証]。
12. インベントリのルートを意味する `Inventory`から始まり0個以上のRecordNameの列とともに別途定められる区切り文字で連結して得られる文字列を「相対パス」と呼ぶ。


???のとき、システム全体で一意となる識別子が付番される[実装依存: `M-`から始まることが多い]。本ドキュメントではこれを「MID」と呼ぶ。
== インベントリの銀河 ==
 
MIDが付与されているエンティティは「MA」と呼ぶ。
 
ユーザー、グループ、あるいはMAを総称して「所有権表明エンティティ」と呼ぶ。
 
システムによって管理されている有向グラフで、各項目の所有者が何らかの所有権表明エンティティとなっているオブジェクトストレージを「インベントリ」と呼ぶ。
 
インベントリの最上のディレクトリであり、親ディレクトリがないディレクトリを「(その)インベントリのルート」と呼ぶ。
 
インベントリにあるオブジェクトは全て「レコード」として管理されている。
 
レコードに付与された識別子を「レコードID」と呼ぶ。
 
 システム全体で一意となる識別子が付番される。
 
  [実装依存: これは `R-`から始まり、その直後にUUIDv4として解釈できる文字列が続くことが***多い***が常時ではないのであてにするべきではない]
 
ユーザーがシステムにログインしたときに生成される推測不可能な文字列を「ローカルマシントークン」と呼ぶ。
 
 コンピューターごとによって異なる[未検証]識別子が付番される。
 
ユーザーが作成されたときに付与される識別子を、「ユーザーID」と呼ぶ。
 
 システム全体で一意となる識別子が付番される。
 
  [実装依存: `U-`から始まることが多い。前プラットフォームからマイグレーションされたユーザーはその後にユーザー名の空白を`-`で置換した文字列が続くことが多いが、ユーザーネームに日本語が使われている場合など反例があるため仮定するのは危険。Resonite内で作成されたユーザーはプレフィクスのあとにUUIDv4として解釈できる文字列が続くことがほとんど。 [Resoniteで新しく作ったユーザーのIDはランダムになるっぽい](https://www.notion.so/Resonite-ID-8e610c06fd214fba94bb9573000acbd8?pvs=21)も参照せよ]
 
グループが作成されたときに付与される識別子を「グループID」と呼ぶ。
 
 システム全体で一意となる識別子が付番される
 
  [実装依存: `G-`から始まることが多い]
 
レコードに内部的につけられ、相対パスのコンポーネントとして使用される文字列を「RecordName」と呼ぶ。
 
 注: 実際に表示されるレコードの名前とは異なる場合がある。特に、UI上で表示されるラベルにRTFを使用している場合は一致しない[未検証]。
 
相対パスはインベントリのルートを意味する `Inventory`から始まり0個以上のRecordNameの列とともに別途定められる区切り文字で連結して得られる文字列である。
 
## インベントリの構造


インベントリは以下のような構造になっている。
インベントリは以下のような構造になっている。


- 個人インベントリのルート
* 個人インベントリのルート
- グループ[0]のインベントリのルート
* グループ[0]のインベントリのルート
- グループ[1]のインベントリのルート
* グループ[1]のインベントリのルート
-
*


どのグループにも所属していない場合は、個人インベントリのルートだけが見える。
どのグループにも所属していない場合は、個人インベントリのルートだけが見える。


### クォータ
=== クォータ ===
 
各ルート下にあるレコードの容量は、そのルートの所有者のクォータに計上される。


 ただし、シンボリックリンク及びそのシンボリックリンクを参照して得られるアイテムは計上されない。
各ルート下にあるレコードの容量は、そのルートの所有者のクォータに計上される。ただし、シンボリックリンク及びそのシンボリックリンクを参照して得られるアイテムは計上されない。クォータを超過すると、超過が解消されるまで新規にアップロードすることができなくなる。


クォータを超過すると、超過が解消されるまで新規にアップロードすることができなくなる。個人インベントリのクォータはPatreonで支援することなどで一時的に引き上げることができる。
個人インベントリのクォータは[[Patreon]]で支援することなどで一時的に引き上げることができる。


### 読みこみ
=== 読みこみ ===


各レコードはアップロードした時点では非公開で、紐付いたルートにアクセスできるアカウントしか存在を知ることができない。APIでも同様であり、認証付きのアクセスを行わなければアクセスに失敗する。
各レコードはアップロードした時点では非公開である。紐付いたルートにアクセスできるアカウントしか存在を知ることができない。APIでも同様であり、認証付きのアクセスを行わなければアクセスに失敗する。


明示的にレコードを公開状態にすることで、認証なしでもアクセスすることができるようになる。
明示的にレコードを公開状態にすることで、認証なしでもアクセスすることができるようになる。
Line 70: Line 39:
公開・非公開は任意のタイミングで切り替えることができる。
公開・非公開は任意のタイミングで切り替えることができる。


### 書き込み
=== 書き込み ===


(未検証) レコードはそのIDを保ちながら中身をすげ替えることができない。
(未検証) レコードはそのIDを保ちながら中身をすげ替えることができない。
Line 80: Line 49:
それ以外の場合は書き込めない。特に、他のアカウントが所有しているアイテムは書き込めない。
それ以外の場合は書き込めない。特に、他のアカウントが所有しているアイテムは書き込めない。


## レコードの内部的な構造
== レコードの内部的な構造 ==


レコードは次の構造で示される。各プロパティの詳しい説明は省略。
レコードは次の構造で示される。各プロパティの詳しい説明は省略。
Line 86: Line 55:
`Record.name` はRecordNameであり、相対パスの構築に使用される。
`Record.name` はRecordNameであり、相対パスの構築に使用される。


```tsx
<syntaxhighlight lang="typescript">
type UserId = `U-{string}`;
type UserId = `U-{string}`;
type GroupId = `G-{string}`;
type GroupId = `G-{string}`;
Line 127: Line 96:
     recordType: "link"
     recordType: "link"
});
});
```
</syntaxhighlight>


## resrec URI
== 略記法 ==
''前システム''からの慣例として、レコードはURIで指し示すことができる。
これらのURIはペーストすると擬似的に[[Cloud Spawn]]できる。


前システムからの慣例として、レコードIDはそのレコードの所有者とともにURIで表記される。典型的な書式は以下の2通り。
=== resrec スキーム ===
resrec スキームを用いる記法は次の2通り。


1. 固定参照方式
1. 固定参照方式
Line 146: Line 118:
相対参照方式は相対パスに依存しているため相対的に使用されることが少ない。
相対参照方式は相対パスに依存しているため相対的に使用されることが少ない。


固定参照方式は [`GET https://api.resonite.com/users/{所有者}/records/{レコードID}`](https://api.resonite.com/users/{所有者}/records/{レコードID}) で、相対参照方式は [`GET https://api.resonite.com/users/{所有者}/records](https://api.resonite.com/users/{所有者}/records/root/{相対パス})?path={\u005Cで連結した相対パス}` で取得できる。所有者がグループの場合、 `/users/` を `/groups/` に読み替えること。
固定参照方式は <code>GET https://api.resonite.com/users/{所有者}/records/{レコードID}</code> で、相対参照方式は <code>GET https://api.resonite.com/users/{所有者}/records/root/{相対パス})?path={\u005Cで連結した相対パス}</code> で取得できる。所有者がグループの場合、 `/users/` を `/groups/` に読み替えること。


特殊な例として `resrec:///M-zkxutoiq5fkqemdd5c9y56sjrrwbmcgpnadmsqq91kd7wm78s9mo/R-Home` があるが、これはResoniteのデフォルトホームを指している。また、各ユーザーの `R-Settings` は設定同期用のbrsonである。これらのレコードIDはUUIDとして解釈できず、今後もこういった特別な形式が増える可能性がある。
特殊な例として <code>resrec:///M-zkxutoiq5fkqemdd5c9y56sjrrwbmcgpnadmsqq91kd7wm78s9mo/R-Home</code> があるが、これはResoniteのデフォルトホームを指している。また、各ユーザーの `R-Settings` は設定同期用のbrsonである。これらのレコードIDはハイフンの後ろがUUIDとして解釈できず、今後もこういった特別な形式が増える可能性がある。


## resdb URI
=== resdb URI ===


以下の書式に沿うURIはレコードへの生固定リンクである。
以下の書式に沿うURIはレコードへの生固定リンクである。
Line 160: Line 132:
拡張子が異なる場合、画像など他の内容を指している。例えば `resdb:///4e88416c9446102d1cd3701136fca8aa502de17874222e174ffe2a23d442d82a.png` はPNG形式の画像を返す。
拡張子が異なる場合、画像など他の内容を指している。例えば `resdb:///4e88416c9446102d1cd3701136fca8aa502de17874222e174ffe2a23d442d82a.png` はPNG形式の画像を返す。


[`GET https://assets.resonite.com/{レコード強化ID}`](https://assets.resonite.com/{レコード強化ID}) でレコードの内容を返す。レコードのデコード方法については[[User:Kisaragi marine/brson]] を参照。
<code>GET https://assets.resonite.com/{レコード強化ID}</code> でレコードの内容を返す。レコードのデコード方法については[[User:Kisaragi marine/brson]] を参照。


## local
=== local URI ===


以下の書式に沿うURIは手元にしか存在しないレコードへの固定リンクである。
以下の書式に沿うURIは手元にしか存在しないレコードへの固定リンクである。

Revision as of 16:36, 8 November 2024

用語

1. プラットフォームを管理しているものを「システム」と呼ぶ。システム全体で一意となる識別子が付番される[注 1]。本ドキュメントではこれを「MID」と呼ぶ。 2. MIDが付与されているエンティティを「MA」と呼ぶ。 3. ユーザー、グループ、あるいはMAを総称して「所有権表明エンティティ」と呼ぶ。 4. システムによって管理されている有向グラフで、各項目の所有者が何らかの所有権表明エンティティとなっているオブジェクトストレージを「インベントリ」と呼ぶ。 5. インベントリの最上のディレクトリであり、親ディレクトリがないディレクトリを「(その)インベントリのルート」と呼ぶ。 6. インベントリにあるオブジェクトを「レコード」と呼ぶ。 7. レコードに付与される識別子を「レコードID」と呼ぶ。システム全体で一意となる識別子が付番される[注 2]。 8. ユーザーがシステムにログインしたときに生成される推測不可能な文字列を「ローカルマシントークン」と呼ぶ。コンピューターごとによって異なる[未検証]識別子が付番される。 9. ユーザーが作成されたときに付与される識別子を、「ユーザーID」と呼ぶ。システム全体で一意となる識別子が付番される。[注 3] 10. グループが作成されたときに付与される識別子を「グループID」と呼ぶ。システム全体で一意となる識別子が付番される[注 4]。 11. レコードに内部的につけられ、相対パスのコンポーネントとして使用される文字列を「RecordName」と呼ぶ。実際に表示されるレコードの名前とは異なる場合がある。特に、インベントリUI上で表示されるラベルにRTFを使用している場合は一致しない[未検証]。 12. インベントリのルートを意味する `Inventory`から始まり0個以上のRecordNameの列とともに別途定められる区切り文字で連結して得られる文字列を「相対パス」と呼ぶ。

インベントリの銀河

インベントリは以下のような構造になっている。

  • 個人インベントリのルート
  • グループ[0]のインベントリのルート
  • グループ[1]のインベントリのルート

どのグループにも所属していない場合は、個人インベントリのルートだけが見える。

クォータ

各ルート下にあるレコードの容量は、そのルートの所有者のクォータに計上される。ただし、シンボリックリンク及びそのシンボリックリンクを参照して得られるアイテムは計上されない。クォータを超過すると、超過が解消されるまで新規にアップロードすることができなくなる。

個人インベントリのクォータはPatreonで支援することなどで一時的に引き上げることができる。

読みこみ

各レコードはアップロードした時点では非公開である。紐付いたルートにアクセスできるアカウントしか存在を知ることができない。APIでも同様であり、認証付きのアクセスを行わなければアクセスに失敗する。

明示的にレコードを公開状態にすることで、認証なしでもアクセスすることができるようになる。

公開・非公開は任意のタイミングで切り替えることができる。

書き込み

(未検証) レコードはそのIDを保ちながら中身をすげ替えることができない。

自分が所有しているアイテムはいつでも書き込める。

自分が所属しているグループが所有しているアイテムはいつでも書き込める。

それ以外の場合は書き込めない。特に、他のアカウントが所有しているアイテムは書き込めない。

レコードの内部的な構造

レコードは次の構造で示される。各プロパティの詳しい説明は省略。

`Record.name` はRecordNameであり、相対パスの構築に使用される。

type UserId = `U-{string}`;
type GroupId = `G-{string}`;
type MID = `M-{string}`;
type RecordOwnerId = UserId | GroupId | MID;
type RecordId = ((string & {}) | "R-Home" | "R-Settings");
export type Record = {
    recordType: string,
    id: RecordId,
    ownerId: RecordOwnerId,
    assetUri: Url,
    version: number,
    name: string,
    description: string,
    ownerName: string,
    tags: string[] | null,
    thumbnailUri: Url | null,
    lastModificationTime: string,
    creationTime,
    firstPublishTime,
    isDeleted: boolean,
    isPublic: boolean,
    isForPatrons: boolean,
    isListed: boolean,
    visits: number,
    rating: number,
    randomOrder: number,
    submissions: unknown[],
    manifest: string[],
    assetManifest: unknown[],
    migrationMetadata?: unknown,
} & ({
    recordType: "directory",
    path: string
} | {
    recordType: "world"
} | {
    recordType: "object"
} | {
    recordType: "link"
});

略記法

前システムからの慣例として、レコードはURIで指し示すことができる。 これらのURIはペーストすると擬似的にCloud Spawnできる。

resrec スキーム

resrec スキームを用いる記法は次の2通り。

1. 固定参照方式

   1.  `resrec:///`
   2. レコード所有者のID
   3. `/`
   4. レコードID

2. 相対参照方式

   1.  `resrec:///` 
   2. レコード所有者のID
   3. `/`
   4. `/`で連結した相対パス

相対参照方式は相対パスに依存しているため相対的に使用されることが少ない。

固定参照方式は GET https://api.resonite.com/users/{所有者}/records/{レコードID} で、相対参照方式は GET https://api.resonite.com/users/{所有者}/records/root/{相対パス})?path={\u005Cで連結した相対パス} で取得できる。所有者がグループの場合、 `/users/` を `/groups/` に読み替えること。

特殊な例として resrec:///M-zkxutoiq5fkqemdd5c9y56sjrrwbmcgpnadmsqq91kd7wm78s9mo/R-Home があるが、これはResoniteのデフォルトホームを指している。また、各ユーザーの `R-Settings` は設定同期用のbrsonである。これらのレコードIDはハイフンの後ろがUUIDとして解釈できず、今後もこういった特別な形式が増える可能性がある。

resdb URI

以下の書式に沿うURIはレコードへの生固定リンクである。

1. `resdb:///` 2. レコード強化ID: 正規表現で `[0-9a-f]+` 3. 拡張子: 正規表現で `\.(brson|7zbson)$`

拡張子が異なる場合、画像など他の内容を指している。例えば `resdb:///4e88416c9446102d1cd3701136fca8aa502de17874222e174ffe2a23d442d82a.png` はPNG形式の画像を返す。

GET https://assets.resonite.com/{レコード強化ID} でレコードの内容を返す。レコードのデコード方法についてはUser:Kisaragi marine/brson を参照。

local URI

以下の書式に沿うURIは手元にしか存在しないレコードへの固定リンクである。

1. `local://` 2. マシンID 3. `/` 4. 名前: ランダム文字列 5. `.lz4bson`

レコードは `lz4bson` 形式で `%UserProfile%\Appdata\LocalLow\Yellow Dog Man Studios\Resonite\Assets\名前.lz4bson` に格納されている。
Cite error: <ref> tags exist for a group named "注", but no corresponding <references group="注"/> tag was found