v0.1首个版本化设计基线查看版本范围
Developer

env

env 提供 guest 无法自行观察、但应用确实需要的宿主环境状态。字段按信任档位粗化并以一致快照返回,避免应用分别探测多个高熵平台细节。

基本示例

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

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

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

适用场景

  • 深浅色主题、语言和粗化时区。
  • 无障碍偏好,如减少动态效果或提高对比度。
  • 绘图面的安全区域。
  • 只用于 UI 提示的粗化连接状态。

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

能力声明

{
  "capabilities": ["host:env.snapshot"]
}

Reference

env.snapshot() -> EnvironmentSnapshot

event env.change {
  changedFields: EnvironmentField[]
}
EnvironmentSnapshot {
  colorScheme: "light" | "dark"
  locale: bounded-locale
  timeZone: bounded-time-zone
  accessibility: {
    reducedMotion: boolean
    increasedContrast: boolean
  }
  connectivity: "offline" | "online" | "unknown"
  safeArea: { top, right, bottom, left }
  precision: "exact" | "coarse"
}

online 只表示宿主认为网络路径可能可用,不保证特定服务可达。

原生 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 绑定返回;未知枚举必须映射为规范的 unknown,不能把浏览器原始字符串穿透给 guest。

精度规则

  • green 应用的 locale 可以只保留语言或语言—文字,时区可以粗化为 UTC offset。
  • 更高档位是否提供更具体值由宿主策略决定,并在 precision 中如实标明。
  • 颜色方案和无障碍布尔偏好属于用户与本应用的直接 UI 上下文。
  • 安全区域使用当前应用绘图面的逻辑像素,不泄露屏幕绝对尺寸。

事件与生命周期

  • change 可以合并多个字段,也可以合并短时间内的重复变化。
  • guest 不应从事件次数推断用户行为。
  • 应用恢复前台时宿主可以只发一次综合变化。
  • 快照内部字段必须来自同一逻辑时点或有明确一致性规则。

安全与预算

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

错误与测试

env.snapshot 通常不会因单个字段不可用而整体失败;该字段使用安全默认或 unknown。一致性测试至少覆盖主题切换、语言/时区粗化、安全区域、后台恢复、事件合并、未知平台值和不同信任档位的信息量。

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事件ime API输入ime.openSession()方法ime.updateState()方法ime.updateGeometry()方法ime.closeSession()方法ime.textUpdate event事件ime.composition event事件ime.formatUpdate event事件ime.characterBoundsRequest 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()方法clipboard.readImage()方法clipboard.writeImage()方法net API网络net.fetch()方法identity API身份identity.status()方法identity.login()方法identity.logout()方法env API平台集成env.snapshot()方法env.change event事件print API平台集成print.open()方法开始调用 Host API指南构建交互式绘图应用指南构建自绘文本编辑器指南管理媒体采集与播放指南组织本地数据与同步指南