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