网页消息接口规范 0.2.0
此能力组让豫言应用订阅、等待、发布和取消订阅当前文档的应用消息。名称必须以“豫言”开头(UTF-8 至多 128 字节);detail 以 UTF-8 JSON 文字传递,最多 1 MiB。订阅的消息进入本应用实例的统一事件队列(类型“消息”,见[网页事件接口规范](../网页事件/规范.汉语.md)),关闭时等待函数以“关闭”为名称返回。发布后的事件在当前文档同步派发,应用须自行用请求编号配对响应。
0.2.0 相对 0.1.0 是行为统一加一个新函数:
- 消息与界面、定时等事件同处一个队列。
等待网页消息只取“消息”类型的事件,其余类型的事件原样留在队列里,不再被吞掉;同样,等待界面事件与等待网页事件也不会吞掉未到取的消息。 - 新增
取消订阅网页消息。 - 同一名称重复
订阅网页消息不产生第二个订阅(0.1.0 的重复订阅行为未规定)。 - 详情超过 1 MiB 或不是有效 JSON 时,
等待网页消息抛事故(事件本身已被取走);通过等待网页事件取到的消息事件带"详情":null与"详情错误":"超过一 MiB"或"详情错误":"不是有效 JSON"。 - 队列上限、丢弃计数与背压规则同网页事件接口(消息类型默认上限 1024,可用
设置网页事件队列上限调整)。
浏览器适配只传递事件名称和 JSON 值,不能执行全局回调或把 JavaScript 对象句柄交给应用。此接口不承诺跨窗口、跨 Worker 或持久消息;需要这些语义时另建能力包。当前宿主必须有文档事件队列,没有文档的平台不提供本组。
函数
订阅网页消息 : 字符串 → 有:订阅当前文档里该名称的消息;名称不合法(不以“豫言”开头,或超过 128 字节)时抛事故;订阅总数至多 128 个。订阅后到达的消息才会入队,订阅前已发出的不补发。等待网页消息 : 有 → (字符串 合 字符串):等待下一个消息,返回(名称,detail 的 JSON 文字);只取消息类型;宿主关闭队列后返回(“关闭”,“null”),之后的调用继续返回相同标记。CustomEvent没有 detail 时详情文字为null。发布网页消息 : 字符串 → 字符串 → 有:在当前文档同步派发消息。detail 必须是有效 JSON 且不超过 1 MiB(字节),名称须合法;否则抛事故。发布者自己订阅了该名称时,也会在自己的队列里收到(应用通常用不同名称区分请求与响应)。取消订阅网页消息 : 字符串 → 有:取消订阅并移除该名称尚未取走的消息;名称未订阅时什么也不做。
失败语义
名称无效、详情非法或超过限额属于违规调用,抛事故;详情超过限额(来自页面上其他脚本发布的消息)是接收时的违规,同样抛事故,但事件已出队,应用可继续等待下一条;宿主关闭不是失败。
限额
| 项 | 限额 | | --- | --- | | 名称 | UTF-8 至多 128 字节,以“豫言”开头 | | detail | 至多 1 MiB(UTF-8 字节) | | 订阅数 | 至多 128 个名称 | | 队列 | 每类型默认 1024,超限丢弃最旧并计数(见网页事件接口) |
一致性样例
- 应用订阅
豫言甲后阻塞在等待界面事件;页面发布豫言甲,随后用户点击带 ID 的按钮:等待界面事件返回(click,按钮 ID),消息仍在队列里;应用随后等待网页消息得(豫言甲,详情文字)。 - 页面发布 detail 为 1 MiB + 1 字节的
豫言甲:应用的等待网页消息抛事故“网页消息详情超过一 MiB”,其后的消息照常收取。 - 订阅两次同名消息再取消一次:该名称不再产生事件,队列里遗留的未取消息被移除。
边界
本包不规定:跨窗口、跨 Worker、持久消息;消息的请求与响应配对(由应用用编号完成);除 JSON 外的详情。