来自 operation progress 事件、Host adapter 或其他不可信边界的候选进度快照。
字段组合满足 DownloadProgressPayload 的最低 wire 约束时返回 true,并将 TypeScript
类型收窄为下载进度 payload;否则返回 false。
对通常的对象字面量,仅允许 loaded、total、lengthComputable 三个 canonical key,并执行以下组合校验:
loaded 始终必需,必须是 0 到 Number.MAX_SAFE_INTEGER 范围内的整数。负数、小数、NaN、
Infinity、unsafe integer、bigint 和数字字符串都会被拒绝。lengthComputable 必须是 boolean,不能使用 0 / 1 或其他 truthy/falsy 值代替。lengthComputable === false 时,total 必须为 undefined;既可以省略该 key,也可以显式写成
total: undefined。此分支不对 loaded 应达到的最终值作推断。lengthComputable === true 时,total 必须是非负 safe integer,且 loaded <= total。
{ loaded: 0, total: 0, lengthComputable: true } 是有效的空内容进度。canonical 集合之外的可枚举自有字符串键会导致失败;非枚举属性、symbol 键和继承属性不在
Object.keys() 检查范围内,必需字段本身也不要求是自有或可枚举属性。该函数不会复制、冻结或
规范化输入。类型谓词只收窄到字段仍为可变、total 仍为可选的 DownloadProgressPayload,
不会在 TypeScript 中建立以 lengthComputable 为判别字段的精确联合。
单个 payload 通过不表示进度来自当前 request、使用当前 pending operation 的 ID,或由可信 Host 产生;
也不保证单位确为字节、事件按时间排序、loaded 相对前一事件单调、total 跨事件稳定、这是最终进度,
或对应字节已经原子提交到目标文件。network.download 的 Runtime 状态机必须另行绑定 request ID,校验
可信响应 framing、maxBytes、取消与终态,并过滤倒退或越界值。
import { isMiniProgramDownloadProgressPayload } from '@heybox/hb-sdk/protocol';
function renderProgress(candidate: unknown) {
if (!isMiniProgramDownloadProgressPayload(candidate)) return;
if (candidate.lengthComputable && candidate.total !== undefined) {
console.log(`${candidate.loaded}/${candidate.total}`);
} else {
console.log(`${candidate.loaded} bytes`);
}
}
renderProgress({ loaded: 512, total: 1024, lengthComputable: true }); // valid
renderProgress({ loaded: 512, lengthComputable: false }); // valid:总长度未知
renderProgress({ loaded: 5, total: 4, lengthComputable: true }); // ignored:loaded > total
onProgress 接收的公开 SDK 进度类型。
判断未知值是否为单个
network.download进度 payload。