本地协议服务
设置本地协议服务路径
用途:将本地目录或 JAPK 资源包注册为 JadeView 内置访问的根目录,并生成一个协议 URL。页面里可以用这个地址加载 JS/CSS/图片,就像小型静态站点,而不必再自己起 Node 或 IIS。
int32_t set_protocol_service_path(
const char* root_path,
char* url_buffer,
size_t buffer_size,
int hot_reload
);
参数:
root_pathstring- 本地静态资源根。两种形式:- 目录:指向包含
index.html等前端产物的文件夹路径; .japk文件:指向磁盘上已存在的 JAPK 归档文件。JadeView 会映射该文件并在JADE://下按包内相对路径提供资源(不解压到临时目录);请求未命中时同样回退到包内的index.html(SPA)。扩展名匹配不区分大小写(如.JAPK)。若归档中某些条目为「解包」存储(旁路.japk.unpacked/ 等价目录),实现会尝试从磁盘旁路读取对应字节。
- 目录:指向包含
url_bufferchar*- 输出参数,用于存储生成的协议 URL(NUL 结尾)buffer_sizesize_t-url_buffer的字节容量(含结尾 NUL)hot_reloadi32(2.2 新增) - 是否启用热载模式。1= 启用,0= 禁用。仅文件系统模式有效,JAPK/ASAR 包模式下忽略
返回值:
1- 成功0- 失败(路径无效、缓冲太小、尚未初始化等)
须在 app-ready 成功之后再调。
与旧版 create_local_server 的差异:过去要在参数里单独传 appname,用来拼内置主机名(如 http://jade.{appname}/...)。2.0 改为由 JadeView_init 已登记的 app_name / app_signature 推导协议身份,因此 C API 少一个参数,避免与初始化信息不一致。
| 旧 API | 2.0 |
|---|---|
create_local_server(root_path, appname, url_buffer, buffer_size) | set_protocol_service_path(root_path, url_buffer, buffer_size) |
安全资源访问系统 (2.2 新增)
通过 token 机制安全地暴露本地文件给前端。宿主层注册资源 → 生成 token 路径 → 前端仅访问已授权资源 → 协议服务动态映射。前端只能看到 token 路径,无法推断真实文件路径。
URL 格式
/---jade---resource--?token=xxx
前端使用同源相对路径,浏览器基于当前页面 origin 自动解析。
注册本地资源(register_resource)
将本地文件注册为安全资源,将资源路径写入 buffer。
int register_resource(
const char* path,
unsigned int window_id,
unsigned int ttl_seconds,
char* url_buffer,
int buffer_size
);
参数:
pathstring- 本地文件绝对路径window_idunsigned int- 所属窗口ID(0= 全局,所有窗口可访问)ttl_secondsunsigned int- 过期时间秒数(0= 默认6秒,-1= 永不过期)url_bufferchar*- 输出参数,用于存储生成的/---jade---resource--?token=xxx路径(NUL 结尾)buffer_sizeint-url_buffer的字节容量(含结尾 NUL)
返回值:
1- 成功0- 失败(路径无效、缓冲太小、尚未初始化等)
前端使用示例:
<video src="/---jade---resource--?token=a3f8d2e1..." />
<img src="/---jade---resource--?token=b7c9f4d2..." />
注销安全资源(unregister_resource)
注销已注册的安全资源。
int unregister_resource(const char* token_or_path);
参数:
token_or_pathstring- token 字符串或完整路径/---jade---resource--?token=xxx
返回值:
1- 成功0- 未找到
清理窗口资源(clear_window_resources)
清理指定窗口的所有已注册资源(窗口关闭时自动调用)。
int clear_window_resources(unsigned int window_id);
参数:
window_idunsigned int- 窗口ID
返回值:
- 清理的资源数量
特性
| 特性 | 说明 |
|---|---|
| Token 安全 | 16字节随机数(SHA1 混合熵源),不可枚举 |
| 防路径穿越 | 注册时 canonicalize() + 检查文件存在 |
| 禁止目录注册 | is_file() 检查 |
| 自动过期 | ttl_seconds 参数,0 = 默认6秒,-1 = 永不过期 |
| 窗口级清理 | 窗口关闭时自动释放该窗口注册的所有资源 |
| Range 请求 | 支持 Range: bytes=start-end,返回 206 Partial Content,视频拖动不卡 |
| MIME 自动识别 | mime_guess 自动识别,不依赖前端指定 |
| 注册表上限 | 最多 4096 条,超出自动清理最旧/过期的条目 |
| 缓存头 | Cache-Control: no-cache,与资源可撤销性一致 |
热载模式 (2.2 新增)
开发阶段文件修改后自动刷新前端页面,无需手动刷新。
工作原理
- 启用热载后,后台线程使用
notifycrate 递归监视root_path目录 - 检测到文件创建/修改/删除事件后,自动清除静态文件缓存
- 通过
hot-reload事件通知前端,前端自动执行location.reload()刷新页面 - 内置 150ms 防抖,避免批量文件修改时频繁刷新
新增事件:hot-reload
文件变更时触发,event_data 为 JSON:
{"paths": ["C:\\project\\index.html", "C:\\project\\style.css"]}
前端无需手动监听此事件,IPC 运行时已内置自动刷新逻辑。
限制
- 仅
ProtocolRoot::Fs(文件系统目录)模式生效 - JAPK / ASAR 资源包模式下
hot_reload参数被忽略 - 同一进程仅支持一个热载监视器实例
⚠️ 破坏性变更:
set_protocol_service_path新增第 4 个参数hot_reload,现有调用需补传0。