来自 Host、bridge response、目录列表或其他不可信边界的候选 descriptor。
顶层字段及嵌套文件引用都满足协议结构时返回 true,并将 TypeScript 类型收窄为
MiniProgramFileDescriptor;否则返回 false。
guard 会读取并校验以下四个属性;对通常的对象字面量,它们也是唯一允许的可枚举自有字符串字段:
kind:固定为 'file'。name:非空字符串。该 guard 不检查空白、.、..、/、反斜杠、控制字符、平台保留名或
name 是否等于 ref.relativePath 的 basename;SDK 创建 FileHandle 时还会执行更严格的名称校验。mode:只能是 'read' 或 'readwrite'。这是 descriptor 声明值,不证明 Host 实际授予了读写权限。ref:必须通过 isMiniProgramFileRef。ref 可以是 { kind: 'file', handleId } 形式的 direct file ref,其中 handleId 只要求非空;也可以是
{ kind: 'file', root, relativePath } 形式的 derived ref。derived root 只能是精确的 sandbox root 或
带非空 handleId 的 direct directory root,不能是 file ref 或再次派生的 directory ref;relativePath
必须是非空、非绝对、无尾随 /、无空段、. / .. 点段、反斜杠或控制字符的相对路径。与目录 ref
不同,文件 ref 不接受 relativePath: '.',因为它必须指向 root 下的具体文件。
顶层 descriptor、ref 与 root 的额外可枚举自有字符串键都会导致失败,包括值为 undefined 的额外键;
非枚举属性、symbol 键和继承属性不在 Object.keys() 检查范围内,必需属性本身也不要求是自有或可枚举
属性。该函数不会复制、冻结或规范化输入。
返回 true 只建立结构类型收窄,不证明 direct handleId 或 root handle 由当前 Runtime 签发、属于当前
session/origin、仍然有效且确为预期类型,也不证明文件存在、名称真实、filesystem 权限已启用、mode
允许当前操作或 Host 支持对应 capability。实际文件操作仍须由 Runtime 查询 handle registry、执行权限、
provenance、目标类型和存在性校验。
isMiniProgramFileSystemEntityDescriptor 使用本 guard 与目录 descriptor guard 识别目录列表项。
files.pickFiles() 与 files.saveFile() 的成功结果要求更窄的 direct file ref,而 sandbox/path API 返回的
descriptor 可以使用 derived ref;本 guard 本身不会区分 descriptor 的来源。
import { isMiniProgramFileDescriptor } from '@heybox/hb-sdk/protocol';
const candidate = {
kind: 'file',
name: 'report.json',
mode: 'readwrite',
ref: {
kind: 'file',
root: { kind: 'sandbox' },
relativePath: 'exports/report.json',
},
};
const untrusted: unknown = candidate;
if (isMiniProgramFileDescriptor(untrusted)) {
// 这里只能安全读取 wire 字段;文件 I/O 仍交给 files API/Runtime。
console.log(untrusted.name, untrusted.mode, untrusted.ref);
}
isMiniProgramFileDescriptor({ ...candidate, size: 1024 }); // false:顶层存在额外键
判断未知值是否具有文件 descriptor 的最低 wire 结构。