v0.1首个正式支持的版本化规范查看版本范围

env

env 提供 guest 无法自行观察、但应用 UI 确实需要的粗化宿主状态。v0.1 对所有应用使用同一封闭 schema 和精度,不因信任档位返回不同字段。

基本示例

let environment = await host.env.snapshot();
applyTheme(environment.colorScheme);

host.events.on('env.change', async ({ changedFields }) => {
  if (!changedFields.includes('colorScheme')) return;
  environment = await host.env.snapshot();
  applyTheme(environment.colorScheme);
});

变化事件只告诉 guest 哪些字段失效;重新读取快照可以避免多个字段来自不同时刻。

适用场景

  • 深浅色主题、粗化语言和当前 UTC offset。
  • 无障碍偏好,如减少动态效果或提高对比度。

设备型号、User-Agent、CPU/GPU、内存、序列号、字体枚举、精确网络类型和稳定硬件标识不属于 env

L1 边界

宿主独占的是操作系统/壳层当前提供给本应用的主题、语言、时区偏移和无障碍偏好。guest 无法从自身计算可靠取得这些状态;主题系统、翻译资源和响应式布局仍由 guest 实现。

能力声明

{
  "capabilities": ["host:env.snapshot"],
  "events": ["env.change"]
}

Reference

env.snapshot() -> EnvironmentSnapshot

event env.change {
  changedFields: EnvironmentField[]
}
EnvironmentSnapshot {
  colorScheme: "light" | "dark"
  locale: {
    language: ascii-lowercase[2..8]
    script?: ascii-titlecase[4]
  }
  timeZoneOffsetMinutes: i16
  accessibility: {
    reducedMotion: boolean
    increasedContrast: boolean
  }
}

EnvironmentField = "colorScheme" | "locale" | "timeZoneOffsetMinutes"
  | "accessibility"

timeZoneOffsetMinutes 是当前本地时间相对 UTC 的分钟差,向最接近的 15 分钟取整并钳制到 [-840, 840];不返回时区名称。locale 不含地区、变体或扩展。绘图面安全区域属于 canvas.getInfo(),避免在环境快照里暗含“主绘图面”。

原生 WASM 示例

EnvironmentSnapshot env = host_env_snapshot();
ui_set_dark_mode(env.color_scheme == COLOR_DARK);
ui_set_reduced_motion(env.accessibility.reduced_motion);

字符串通过有界 UTF-8 绑定返回。宿主无法规范化字段时整个 snapshot()unavailable 失败,不能把浏览器原始字符串或规范外枚举穿透给 guest。

精度规则

  • locale 固定只保留语言和可选文字;时区固定为粗化 UTC offset。
  • 颜色方案和无障碍布尔偏好属于用户与本应用的直接 UI 上下文。

事件与生命周期

  • 尚未交付的 change 可以合并多个字段和重复变化;合并结果是其间所有失效字段的集合。
  • guest 不应从事件次数推断用户行为。
  • 应用恢复前台时,后台期间的变化可以合并为一次综合失效通知。
  • snapshot() 必须线性化:在调用开始与返回之间存在一个逻辑时点,返回的所有字段都等于该时点状态。字段在该点之后变化时,若已声明 env.change,对应失效事件必须在快照返回后仍可送达,不能被这次读取吞掉。

安全与预算

  • 信任档位:green;入向 flow 如实标记,provenance 为 app-context
  • 字段集合封闭;新增高熵字段必须进入新版本并重新做指纹评审。
  • v0.1 预算键为 env.snapshotsPerMinuteenv.changesPerMinute
  • 不提供可用来构造高精度计时器的时间戳。
  • 宿主不得为追踪目的故意制造每应用不同的环境值。

错误与测试

env.snapshot 无法形成完整封闭快照时以 unavailable 失败,不得捏造默认值。一致性测试至少覆盖主题切换、语言/时区粗化、后台恢复、事件合并和未知平台值。

Host API 版本与分层概览Host API v0.1版本非正式提议提议canvas API呈现canvas.getInfo()方法canvas.draw()方法canvas.present()方法canvas.measureText()方法canvas.frame event事件canvas.resize event事件asset API呈现asset.read()方法asset.loadFont()方法playback API呈现playback.open()方法playback.write()方法playback.stop()方法playback.ready event事件playback.ended event事件input API输入input.focus()方法input.pointer event事件input.key event事件input.wheel event事件input.focusChange event事件ime API输入ime.openSession()方法ime.updateState()方法ime.updateGeometry()方法ime.closeSession()方法ime.textUpdate event事件ime.composition event事件ime.formatUpdate event事件ime.characterBoundsRequest event事件ime.ended event事件capture API输入capture.requestCamera()方法capture.requestMic()方法capture.frame()方法capture.readAudio()方法capture.stop()方法capture.ended event事件store API数据store.get()方法store.put()方法store.delete()方法store.list()方法store.deletePrefix()方法clipboard API数据clipboard.readText()方法clipboard.writeText()方法env API平台集成env.snapshot()方法env.change event事件开始调用 Host API指南构建交互式绘图应用指南构建自绘文本编辑器指南管理媒体采集与播放指南组织本地数据与同步指南