ストレージバケット API

コミュニティグループ報告書草案,

このバージョン:
https://wicg.github.io/storage-buckets/
課題追跡:
GitHub
仕様内インライン
編集者:
(Google)
(Google)
元編集者:
Victor Costan
参加:
GitHub WICG/storage-buckets (新しい課題, 未解決の課題)

概要

Storage Buckets API は、サイトがローカルに保存されたデータを「ストレージバケット」と呼ばれるグループに整理する方法を提供します。これにより、ユーザーエージェントまたはサイトは、単一のオリジンからのすべてのデータに同じ扱いを適用するのではなく、バケットを独立して管理および削除できます。

この文書のステータス

この仕様は、Web Platform Incubator Community Group により公開されました。 これは W3C 標準ではなく、W3C 標準化過程上にもありません。 W3C Community Contributor License Agreement (CLA) の下では、限定的なオプトアウトおよびその他の条件が適用されることに注意してください。 W3C Community and Business Groups について詳しく学んでください。

1. StorageBucketManager インターフェイス

[SecureContext]
interface mixin NavigatorStorageBuckets {
  [SameObject] readonly attribute StorageBucketManager storageBuckets;
};
Navigator includes NavigatorStorageBuckets;
WorkerNavigator includes NavigatorStorageBuckets;

環境設定オブジェクトは、関連付けられたStorageBucketManager オブジェクトを持ちます。

storageBuckets 取得子の 手順は、this関連する設定オブジェクトStorageBucketManager オブジェクトを返すことです。

ユーザーエージェントは、関連付けられたstorage bucket managerを持ち、これは 新しい並列キューを開始する結果です。

[Exposed=(Window,Worker),
 SecureContext]
interface StorageBucketManager {
    Promise<StorageBucket> open(DOMString name, optional StorageBucketOptions options = {});
    Promise<sequence<DOMString>> keys();
    Promise<undefined> delete(DOMString name);
};

dictionary StorageBucketOptions {
  boolean persisted = false;
  unsigned long long quota;
  DOMHighResTimeStamp expires;
};

1.1. バケットの作成

open(name, options) メソッドの手順は次のとおりです:

  1. environmentthis関連する設定オブジェクトとします。

  2. shelf を、environment を与えて ローカルストレージ棚を取得するを実行した結果とします。

  3. shelf が failure である場合、TypeError拒否された promise を返します。

  4. name を指定してバケット名を検証する結果が failure である場合、 TypeError拒否された promise を返します。

  5. p新しい promiseとします。

  6. 次の手順をstorage bucket managerキューに入れます:

    1. r を、shelfname、 および options を指定してバケットを開くを実行した結果とします。

    2. r が failure である場合、TypeErrorp拒否するために、ストレージタスクをキューに入れます

    3. それ以外の場合、rp解決するために、ストレージタスクをキューに入れます

  7. p を返します。

shelf 上で、バケット name および任意の options を指定して バケットを開くには、 次の手順を実行します:

  1. expires を undefined とします。

  2. options["expires"] が存在する場合:

    1. expiresoptions["expires"] に設定します。

    2. Unix epochexpires ミリ秒後が、 関連する設定オブジェクト現在の壁時計時刻より前である場合、failure を返します。

  3. quota を undefined とします。

  4. options["quota"] が存在する場合:

    1. quotaoptions["quota"] に設定します。

    2. quota が 0 以下である場合、failure を返します。

  5. persisted を false とします。

  6. options["persisted"] が true である場合:

    1. permission を、 "persistent-storage"使用する許可を要求する結果とします。

    2. permission が "granted" である場合、 persisted を true に設定します。

  7. bucket を、shelfname を指定して バケットを取得または期限切れにするを実行した結果とします。

  8. bucket が null である場合:

    1. bucket を、名前 name を持つ新しいストレージバケットに設定します。

    2. bucketクォータ値quota に設定します。

    3. shelfバケット マップ[name] を bucket に設定します。

  9. persisted が true である場合、bucketバケットモード"persistent" に設定します。

  10. bucket有効期限を、Unix epochexpires ミリ秒後に設定します。

  11. storageBucket を新しい StorageBucket とします。

  12. storageBucketストレージ バケットbucket に設定します。

  13. storageBucket を返します。

文字列 name を指定してバケット名を 検証するには、次の手順を実行します:

  1. name に、ASCII 小文字英字ASCII 数字、 U+005F (_)、または U+002D(-) ではない符号位置が 含まれる場合、failure を返します。

  2. name符号位置長が 0 であるか 64 を超える場合、failure を返します。

  3. name が U+005F (_) または U+002D(-) で始まる場合、failure を返します。

  4. 返ります。

shelf 上で文字列 name を指定してバケットを取得または期限切れにするには、 次の手順を実行します:

  1. bucket を、存在する場合は shelfバケット マップ[name] とします。存在しない場合は null を返します。

  2. bucket有効期限時刻が非 null であり、関連する設定オブジェクト現在の壁時計時刻より前である場合:

    1. bucketremoved を true に設定します。

    2. null を返します。

  3. bucket を返します。

1.2. バケットの削除

delete(name) メソッドの 手順は次のとおりです:

  1. environmentthis関連する設定オブジェクトとします。

  2. shelf を、environment を与えて ローカルストレージ棚を取得するを実行した結果とします。

  3. shelf が failure である場合、TypeError拒否された promise を返します。

  4. p新しい promiseとします。

  5. name を指定してバケット名を検証する結果が failure である場合、 InvalidCharacterErrorp拒否します。

  6. それ以外の場合、次の手順をstorage bucket managerキューに入れます:

    1. shelfname を指定してバケットを 削除するを実行します。

    2. p解決するために、ストレージタスクをキューに入れます

  7. p を返します。

shelf 上でバケット name を指定して バケットを削除するには、 次の手順を実行します:

  1. bucket を、存在する場合は shelfバケット マップ[name] とします。存在しない場合は返ります。

  2. shelfバケットマップ内の キー name を削除します。

  3. bucketremoved を true に設定します。

  4. 返ります。

[IndexedDB-3] は、データがクォータにより退去されたとき削除がどのように発生するかを定義する必要があります。

[FS] は、データがクォータにより退去されたとき、 Bucket File System で削除がどのように発生するかを定義する必要があります。

[Service-Workers] は、データがクォータにより退去されたとき、CacheStorage および Service Workers で削除がどのように発生するかを定義する必要があります。

1.3. バケットの列挙

keys() メソッドの手順は次のとおりです:

  1. shelf を、ローカルストレージ棚を取得するを実行した結果とします。

  2. shelf が failure である場合、TypeError拒否された promise を返します。

  3. p新しい promiseとします。

  4. keys を新しいリストとします。

  5. 次の手順をstorage bucket managerキューに入れます:

    1. shelfバケット マップ内の各 key について、次の手順を実行します:

      1. bucket を、shelfkey を指定して バケットを取得または期限切れにするを実行した結果とします。

      2. bucket が非 null である場合、keykeys付加します。

    2. keysp解決するために、ストレージタスクをキューに入れます

  6. p を返します。

2. StorageBucket インターフェイス

[Exposed=(Window,Worker),
 SecureContext]
interface StorageBucket {
  readonly attribute DOMString name;

  [Exposed=Window] Promise<boolean> persist();
  Promise<boolean> persisted();

  Promise<StorageEstimate> estimate();

  Promise<undefined> setExpires(DOMHighResTimeStamp expires);
  Promise<DOMHighResTimeStamp?> expires();

  [SameObject] readonly attribute IDBFactory indexedDB;

  [SameObject] readonly attribute CacheStorage caches;

  Promise<FileSystemDirectoryHandle> getDirectory();
};

StorageBucket は、関連付けられたストレージバケットを持ちます。

ストレージバケットは、関連付けられたremoved フラグを持ち、これは boolean で、初期値は false です。 ストレージバケットが削除されたとき true に設定されます。

StorageBucket は、バケットマップ内で ストレージバケットに対応付けられるキーである、DOMString オブジェクト name を持ちます。

2.1. 永続性

すでに バケットモードを定義しているStorage § 4.5 Storage buckets と統合します。

persist() メソッドの手順は次のとおりです:

  1. bucketthisストレージ バケットとします。

  2. environmentthis関連する設定オブジェクトとします。

  3. p新しい promiseとします。

  4. 次の手順を並列に実行します:

    1. bucketremoved フラグが true である場合、 InvalidStateErrorp拒否するために、ストレージタスクをキューに入れます

    2. bucketバケット モード"persistent" である場合、persisted を true とします。

    3. それ以外の場合、

      1. permission を、"persistent-storage" および environment現在の許可状態を取得する結果とします。

      2. permission が "granted" である場合、 bucketバケットモード"persistent" に設定し、 persisted を true に設定します。

      3. それ以外の場合、persisted を false に設定します。

    4. persistedp解決するために、ストレージタスクをキューに入れます

  5. p を返します。

persisted() メソッドの手順は次のとおりです:

  1. p新しい promiseとします。

  2. bucketthisストレージ バケットとします。

  3. それ以外の場合、これらの手順を並列に実行します:

    1. bucketremoved フラグが true である場合、 InvalidStateErrorp拒否するために、ストレージタスクをキューに入れます

    2. bucketバケット モード"persistent" である場合は persistent を true とし、 それ以外の場合は false とします。

    3. persistentp解決するために、ストレージタスクをキューに入れます

  4. p を返します。

2.2. クォータ

ストレージバケットは、クォータ 値、すなわち number-or-null を持ち、初期値は null です。 バケットが使用できるバイト単位の使用量の上限を指定します。ユーザーエージェントは、実現されるストレージ空間をさらに制限してもよいです。

ストレージバケットストレージ使用量は、そのすべてのストレージボトルで 使用されるバイト数の実装定義の概算です。

estimate() メソッドの手順は次のとおりです:

  1. environmentthis関連する設定オブジェクトとします。

  2. shelf を、environmentローカルストレージ棚を取得するを実行した結果とします。

  3. shelf が failure である場合、TypeError拒否された promise を返します。

  4. bucketthisストレージ バケットとします。

  5. bucketremoved フラグが true である場合、 InvalidStateError拒否された promise を返します。

  6. p新しい promiseとします。

  7. それ以外の場合、次の手順を並列に実行します:

    1. quotashelfストレージクォータとします。

    2. bucketクォータ 値が非 null である場合、quota をそれに設定します。

    3. usagebucketストレージ使用量とします。

    4. usage メンバーが usage で、quota メンバーが quota である新しい StorageEstimate 辞書を dictionary とします。

    5. dictionaryp解決するために、ストレージタスクをキューに入れます

  8. p を返します。

2.3. 有効期限

ストレージバケットは、有効期限時刻を持ち、これは null または 壁時計上の時点であり、 初期値は null です。 バケットの寿命の上限を指定します。

バケットを取得または期限切れにする アルゴリズムは、keys() または open() が呼び出されたとき、期限切れのバケットを削除します。 ユーザーエージェントは、ストレージ圧力に直面した場合、バケットモード"best-effort" であるバケットを、その有効期限時刻より前に消去してもよいです。 ユーザーエージェントは、バケットモードにかかわらず、 有効期限に達した場合、open() または keys() が呼び出される前に任意のバケットを削除してもよいです。

setExpires(expires) メソッドの手順は 次のとおりです:

  1. p新しい promiseとします。

  2. bucketthisストレージ バケットとします。

  3. それ以外の場合、これらの手順を並列に実行します:

    1. bucketremoved フラグが true である場合、 InvalidStateErrorp拒否するために、ストレージタスクをキューに入れます

    2. それ以外の場合、bucket有効期限時刻を、 Unix epochexpires ミリ秒後に設定します。

    3. p解決するために、ストレージタスクをキューに入れます

  4. p を返します。

expires() メソッドの手順は次のとおりです:

  1. p新しい promiseとします。

  2. bucketthisストレージ バケットとします。

  3. それ以外の場合、これらの手順を並列に実行します:

    1. bucketremoved フラグが true である場合、 InvalidStateErrorp拒否するために、ストレージタスクをキューに入れます

    2. それ以外の場合、expirationbucket有効期限時刻とします。

    3. expirationp解決するために、ストレージタスクをキューに入れます

  4. p を返します。

2.4. ストレージエンドポイントの使用

ストレージエンドポイント、すなわちストレージボトルには、以下で説明するようにアクセスできます。

2.4.1. Indexed Database の使用

IDBFactory メソッドは storageKey ではなくストレージボトルマップを取る必要があります。

StorageBucketIDBFactory オブジェクトを持ち、初期値は null です。indexedDB 取得子の手順は次のとおりです:

  1. thisindexedDB が null である場合、次の手順を実行します:

    1. bucketthisストレージバケットとします。

    2. bottle map を、bucket"indexedDB"ローカルストレージボトルマップを取得する結果とします。

    3. indexedDBIDBFactory オブジェクトとします。

    4. indexedDBストレージボトルマップbottle map に設定します。

    5. thisindexedDBindexedDB に設定します。

  2. thisindexedDB を返します。

2.4.2. CacheStorage の使用

StorageBucketCacheStorage オブジェクトを持ち、初期値は null です。caches 取得子の 手順は次のとおりです:

  1. thiscaches が null である場合、次の手順を実行します:

    1. bucketthisストレージバケットとします。

    2. bottle map を、bucket"cacheStorage"ローカルストレージボトル マップを取得する結果とします。

    3. cacheStorageCacheStorage オブジェクトとします。

    4. cacheStorage関連する名前からキャッシュへのマップbottle map に設定します。

    5. thiscachescacheStorage に設定します。

  2. thiscaches を返します。

2.4.3. Bucket File System の使用

[Storage] は、指定された(非デフォルトの)バケットのボトルマップを取得するための ヘルパーを定義する必要があります。

[FS] は、ボトルマップを指定して OPFS を取得するためのヘルパーを定義する必要があります。

getDirectory() の手順は次のとおりです:

  1. map を、thisストレージ バケット"fileSystem"ローカルストレージボトルマップを取得する結果とします。

  2. mapgetDirectory を実行した結果を返します。

2.5. Clear Site Data 統合

Clear Site Data § 3.1 The Clear-Site-Data HTTP Response Header Field を更新します。

"storage:bucket-name"

型文字列が "storage:" で始まる場合、: の後の残りの文字は、 特定の応答の URL のオリジン内の特定のストレージ バケットを参照するものとして扱われます。

以下の手順を Clear Site Data § 4.1 Parsing のアルゴリズムに追加します。

バケット付き Clear-Site-Data ヘッダーを解析するには、次の手順を実行します:

  1. header 内の各 type について、次の手順を実行します:

    1. type"storage:"始まらない場合、これらの手順を中止します。

    2. bucket name を、type の 8 から終端までの 符号単位部分文字列とします。

    3. bucket nameバケット名を検証する結果が failure である場合、これらの手順を中止します。

    4. ("storage-bucket", bucket name) からなる タプルtypes に付加します。

以下の手順を Clear Site Data § 4.2 Clear data for response のアルゴリズムに追加します。

bucket name を指定してバケット付きでデータを消去するには、 次の手順を実行します:

  1. environmentthis関連する設定オブジェクトとします。

  2. shelf を、environment を与えて ローカルストレージ棚を取得するを実行した結果とします。

  3. shelf が failure である場合、TypeError投げ、これらの手順を中止します。

  4. types 内の各 type について、次の手順を実行します:

    1. typeタプルではない、 または type[0] が "storage-bucket" ではない場合、これらの手順を中止します。

    2. bucket を、存在する場合は shelfバケット マップ[bucket name] とします。存在しない場合はこれらの手順を中止します。

    3. bucket を削除します。

3. セキュリティおよびプライバシーの考慮事項

適合性

文書の 規約

適合性要件は、 記述的な表明と RFC 2119 用語の組み合わせで表現されます。 この文書の規範的部分におけるキーワード “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, および “OPTIONAL” は、RFC 2119 で説明されているように解釈されます。 ただし、読みやすさのために、 この仕様ではこれらの語はすべて大文字では表記されません。

この仕様のすべてのテキストは、 明示的に非規範的と記された節、例、および注記を除き、規範的です。 [RFC2119]

この仕様の例は、“for example” という語で導入されるか、 または規範的テキストから class="example" によって分離されます。 次のようになります:

これは情報提供用の例の一例です。

情報提供用の注記は “Note” という語で始まり、 規範的テキストから class="note" によって分離されます。 次のようになります:

Note, これは情報提供用の注記です。

索引

この仕様で定義される 用語

参照により定義される 用語

参照文献

規範的参照文献

[CLEAR-SITE-DATA]
Mike West. Clear Site Data. URL: https://w3c.github.io/webappsec-clear-site-data/
[FS]
Austin Sullivan. File System Standard. Living Standard. URL: https://fs.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[IndexedDB-3]
Joshua Bell. Indexed Database API 3.0. URL: https://w3c.github.io/IndexedDB/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[PERMISSIONS]
Marcos Caceres; Mike Taylor. Permissions. URL: https://w3c.github.io/permissions/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[Service-Workers]
Jake Archibald; Marijn Kruisselbrink. Service Workers. URL: https://w3c.github.io/ServiceWorker/
[Storage]
Anne van Kesteren. Storage Standard. Living Standard. URL: https://storage.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

IDL 索引

[SecureContext]
interface mixin NavigatorStorageBuckets {
  [SameObject] readonly attribute StorageBucketManager storageBuckets;
};
Navigator includes NavigatorStorageBuckets;
WorkerNavigator includes NavigatorStorageBuckets;

[Exposed=(Window,Worker),
 SecureContext]
interface StorageBucketManager {
    Promise<StorageBucket> open(DOMString name, optional StorageBucketOptions options = {});
    Promise<sequence<DOMString>> keys();
    Promise<undefined> delete(DOMString name);
};

dictionary StorageBucketOptions {
  boolean persisted = false;
  unsigned long long quota;
  DOMHighResTimeStamp expires;
};

[Exposed=(Window,Worker),
 SecureContext]
interface StorageBucket {
  readonly attribute DOMString name;

  [Exposed=Window] Promise<boolean> persist();
  Promise<boolean> persisted();

  Promise<StorageEstimate> estimate();

  Promise<undefined> setExpires(DOMHighResTimeStamp expires);
  Promise<DOMHighResTimeStamp?> expires();

  [SameObject] readonly attribute IDBFactory indexedDB;

  [SameObject] readonly attribute CacheStorage caches;

  Promise<FileSystemDirectoryHandle> getDirectory();
};

課題索引

[IndexedDB-3] は、データがクォータにより退去されたとき削除がどのように発生するかを定義する必要があります。
[FS] は、 データがクォータにより退去されたとき、Bucket File System で削除がどのように発生するかを定義する必要があります。
[Service-Workers] は、データがクォータにより退去されたとき、CacheStorage および Service Workers で削除がどのように発生するかを定義する必要があります。
すでにStorage § 4.5 Storage bucketsバケットモードを定義しているものと統合します。
IDBFactory メソッドは storageKey ではなくストレージボトルマップを取る必要があります。
[Storage] は、指定された(非デフォルトの)バケットのボトルマップを取得するためのヘルパーを定義する必要があります。
[FS] は、 ボトルマップを指定して OPFS を取得するためのヘルパーを定義する必要があります。
Clear Site Data § 3.1 The Clear-Site-Data HTTP Response Header Field を更新します。
以下の手順を Clear Site Data § 4.1 Parsing のアルゴリズムに追加します。
以下の手順を Clear Site Data § 4.2 Clear data for response のアルゴリズムに追加します。