03 · 宿主规则
本章列出宿主对插件的结构性约束与自身的行为规则。这些规则不是安全审核,也不评判插件的用途: 它们只保证"一个插件出问题不拖垮应用",以及"应用不给上游添麻烦"。
1. 隔离
由运行时结构保证(见 02 §1):
- 插件接触不到文件系统、进程、应用内部接口与其他插件的数据;它能做的外部事情全部经
hg.*。 - 每插件独立运行时、内存预算与执行调度;脚本死循环、内存超限由宿主中断并重建该运行时。 不保证隔离原生引擎的进程级故障,不要求进程级沙箱。
- 插件无法绘制界面:它返回数据,界面由宿主渲染。唯一例外是用户主动打开的网页视图(04 §12)。
插件可持久化读写自己的存储与 Cookie;也可读取自己的设置、运行环境及宿主传入的业务参数。
它能通过已公开的 hg.* 接口取得外部数据,不能直接访问宿主内部数据。
解析器是唯一的跨插件协作(06 §3):宿主把数据源给出的播放页地址与
非凭据请求头交给解析器,解析器返回可播放地址。两者不共享存储、Cookie 与登录态,
Authorization 与 Cookie 请求头不会转交。
媒体资源的提供者、解析链与实际请求环境由宿主记录,见 09。
2. 网络
插件的 API 请求与宿主取得的全部媒体(含图片、字幕与视频)经过宿主网络层。 可选网页视图使用平台原生网络栈,不承诺所有网页子资源经过该 HTTP 客户端或 DNS 固定机制; 它是用户主动打开的独立浏览环境,不能访问应用桥接接口。宿主自身的本地会话传输不视为上游出站请求。
| 规则 | 说明 |
|---|---|
| 协议 | 只允许 https:;http: 仅当插件声明 allowInsecureHttp |
| 地址形式 | 不允许含用户名密码的地址;不允许控制字符 |
| 内网防护 | 默认拒绝解析到回环、私网、链路本地、保留地址的目标,以及 localhost、.local、.internal 等主机名;代理软件的 FakeIP 网段 198.18.0.0/15 放行 |
| DNS | 通过检查的解析结果直接用于连接(DNS 固定),不在检查后重新解析 |
| 重定向 | 至多 5 跳,每跳重新检查;禁止 HTTPS → HTTP 降级 |
| 请求头 | 丢弃 Host、Content-Length、Connection、Transfer-Encoding、Accept-Encoding 等由传输层决定的头 |
| 代理 | 遵循系统代理设置;用户也可用环境变量强制指定 |
内网防护与应用现有的"严格安全模式"是同一套设置:用户为自建服务(NAS、自托管媒体库) 关闭严格模式时,插件 API 与媒体流量一并放宽。宿主应当在界面上说明作用范围,不把网页视图描述成同一网络栈。
3. 上游友好
下表是 HGhub 默认调度策略,由宿主执行,插件无需实现;速率、并发与缓存容量不作为固定协议常量, 可按实际运行调优。取消、无自由后台执行和用户触发边界仍是协议约定。
| 项 | 默认值 |
|---|---|
| 接口请求速率 | 5 次/秒,突发 15,单插件并发 6(单主机 ≤ 4) |
| 遇到 429 / 503 | 按 Retry-After 冷却该主机(上限 10 分钟),冷却期内请求立即失败并提示稍后重试 |
| 在途去重 | 参数相同的匿名 GET 合并为一次请求 |
| 后台活动 | 无。宿主不调用,插件不运行 |
| 播放信息预取 | 至多提前一条;网络受限或配额不足时不预取 |
| 聚合搜索 | 只在用户提交搜索时触发;输入联想不跨插件 |
| 进度回报 | 每 30 秒至多一次,另加开始、暂停、结束各一次 |
| 更新检查 | 自动检查同一插件同一地址不短于 24 小时一次;用户手动检查不受此间隔限制 |
API 请求、交互式播放、下载分别排队;播放分片不计入 API 的 5 次/秒额度,避免媒体缓冲阻塞登录与搜索。
同一资源主机的 Retry-After 冷却在各队列及插件间共享;只有当前实际响应触发冷却,不能用插件错误任意冷却其他主机。
宿主对媒体另设有限并发,优先当前播放,再考虑预取和下载。下载逐集排队,不并发批量解析整个片库。
匿名 GET 去重只合并实际请求地址及有效请求头相同的请求;一个等待者取消不能中断其他仍需要的请求。
4. 隐私
- 插件能取得自己作用域中的运行信息、设置、存储、Cookie、业务参数及通过公开 API 获取的外部内容。
- 宿主不向插件暴露设备标识、文件系统、其他插件的数据或整个本地片库。
updates.check与progress.report仅接收所属插件的必要条目与当前播放进度,不得借此枚举其他来源。 - 宿主不收集、不上传任何使用数据;日志只存在本机。