存储桶 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 为以 shelfnameoptions 运行打开存储桶的结果。

    2. 如果 r 是 failure,则排入一个存储任务,以用 TypeError 拒绝 p

    3. 否则,排入一个存储任务,以用 r 解决 p

  7. 返回 p

要为 shelf,给定存储桶 name 和可选的 options打开存储桶,运行以下 步骤:

  1. expires 为 undefined。

  2. 如果 options["expires"] 存在,则:

    1. expires 设为 options["expires"]。

    2. 如果 Unix 纪元之后 expires 毫秒的时刻早于 相关设置对象当前墙上时间,则返回 failure。

  3. quota 为 undefined。

  4. 如果 options["quota"] 存在,则:

    1. quota 设为 options["quota"]。

    2. 如果 quota 小于或等于零,则返回 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 纪元之后 expires 毫秒。

  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. 如果存在,则令 bucketshelf存储桶 映射[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,则用 InvalidCharacterError 拒绝 p

  6. 否则,将以下步骤入队storage bucket manager

    1. shelfname 运行移除存储桶

    2. 排入一个存储任务,以解决 p

  7. 返回 p

要在 shelf 上,给定存储桶 name移除存储桶, 运行以下步骤:

  1. 如果存在,则令 bucketshelf存储桶 映射[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,则将 key 附加keys

    2. 排入一个存储任务,以用 keys 解决 p

  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 标志,它是一个布尔值,初始为 false。当一个 存储桶被删除时将其设为 true。

StorageBucket 有一个 DOMString 对象 name,它是存储桶映射中映射到 存储桶的键。

2.1. 持久性

与已经定义 存储桶模式Storage § 4.5 Storage buckets 合并。

persist() 方法步骤为:

  1. bucketthis存储 桶

  2. environmentthis相关设置对象

  3. p一个新的 promise

  4. 并行运行以下步骤:

    1. 如果 bucketremoved 标志为 true,则排入一个存储任务,以用 InvalidStateError 拒绝 p

    2. 如果 bucket存储桶 模式"persistent",则令 persisted 为 true。

    3. 否则,

      1. permission 为以 "persistent-storage"environment 获取当前权限状态的结果。

      2. 如果 permission 是 "granted", 则将 bucket存储桶模式设为 "persistent",并 将 persisted 设为 true。

      3. 否则,将 persisted 设为 false。

    4. 排入一个存储任务,以用 persisted 解决 p

  5. 返回 p

persisted() 方法步骤为:

  1. p一个新的 promise

  2. bucketthis存储 桶

  3. 否则,并行运行这些步骤:

    1. 如果 bucketremoved 标志为 true,则排入一个存储任务,以用 InvalidStateError 拒绝 p

    2. 如果 bucket存储桶 模式"persistent",则令 persistent 为 true,否则为 false。

    3. 排入一个存储任务,以用 persistent 解决 p

  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. dictionary 为一个新的 StorageEstimate 字典,其 usage 成员是 usage,且 quota 成员是 quota

    5. 排入一个存储任务,以用 dictionary 解决 p

  8. 返回 p

2.3. 过期

存储桶有一个 过期时间,它要么是 null,要么是时刻墙上时钟上的值,初始为 null。 指定存储桶生命周期的上限。

获取或过期 存储桶算法会在调用 keys()open() 时移除已过期的存储桶。 当面临存储压力时,用户代理可以在存储桶模式"best-effort" 的存储桶达到其过期时间之前清除它们。 无论存储桶模式如何,当达到过期时间时, 用户代理可以在调用 open()keys() 之前移除任何存储桶

setExpires(expires) 方法步骤 为:

  1. p一个新的 promise

  2. bucketthis存储 桶

  3. 否则,并行运行这些步骤:

    1. 如果 bucketremoved 标志为 true,则排入一个存储任务,以用 InvalidStateError 拒绝 p

    2. 否则,将 bucket过期时间设为 Unix 纪元之后 expires 毫秒。

    3. 排入一个存储任务,以解决 p

  4. 返回 p

expires() 方法步骤为:

  1. p一个新的 promise

  2. bucketthis存储 桶

  3. 否则,并行运行这些步骤:

    1. 如果 bucketremoved 标志为 true,则排入一个存储任务,以用 InvalidStateError 拒绝 p

    2. 否则,令 expirationbucket过期时间

    3. 排入一个存储任务,以用 expiration 解决 p

  4. 返回 p

2.4. 使用存储端点

存储端点,即存储瓶,可以按如下所述访问。

2.4.1. 使用 Indexed Database

IDBFactory 方法需要接受一个存储瓶映射,而不是 storageKey。

StorageBucket 有一个 IDBFactory 对象,初始为 null。indexedDB 获取器步骤为:

  1. 如果 thisindexedDB 为 null,运行以下步骤:

    1. bucketthis存储桶

    2. bottle map 为以 bucket"indexedDB" 运行获取本地存储瓶映射的结果。

    3. indexedDB 为一个 IDBFactory 对象。

    4. indexedDB存储瓶映射设为 bottle map

    5. thisindexedDB 设为 indexedDB

  2. 返回 thisindexedDB

2.4.2. 使用 CacheStorage

StorageBucket 有一个 CacheStorage 对象,初始为 null。caches 获取器 步骤为:

  1. 如果 thiscaches 为 null,运行以下步骤:

    1. bucketthis存储桶

    2. bottle map 为以 bucket"cacheStorage" 运行获取本地存储瓶 映射的结果。

    3. cacheStorage 为一个 CacheStorage 对象。

    4. cacheStorage相关名称到缓存映射设为 bottle map

    5. thiscaches 设为 cacheStorage

  2. 返回 thiscaches

2.4.3. 使用 Bucket File System

[Storage] 需要定义辅助工具来检索给定(非默认)存储桶的 瓶映射。

[FS] 需要定义辅助工具来在给定瓶映射的情况下检索 OPFS。

getDirectory() 步骤为:

  1. map 为以 this存储 桶"fileSystem" 运行获取本地存储瓶映射的结果。

  2. 返回以 map 运行 getDirectory 的结果。

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 nametype 中从 8 到结尾的按位置取码元子字符串

    3. 如果以 bucket name 运行验证存储桶名称的结果是 failure,则中止这些步骤。

    4. types 附加一个由 ("storage-bucket", bucket name) 组成的元组

将以下步骤添加到 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. 如果存在,则令 bucketshelf存储桶 映射[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 中的算法。