Skip to content

fix(plugin): 修复 MessageTarget C ABI 序列化与文档不一致及 Windows 下集成测试稳定性问题 - #321

Merged
LanRhyme merged 1 commit into
MicYou-Dev:masterfrom
OrientCOMPASS:fix/send-message-target-json-format
Aug 31, 2026
Merged

LanRhyme merged 1 commit into
MicYou-Dev:masterfrom
OrientCOMPASS:fix/send-message-target-json-format

Conversation

@OrientCOMPASS

Copy link
Copy Markdown
Contributor

Closes #316

📝 背景与动机 (Background & Motivation)

在 Issue #316 中,指出 send_message C ABI 的 target_json 参数格式与官方文档描述严重不符。
文档描述的是 内部标签 (Internally Tagged) 格式(如 {"type":"local","pluginId":"..."}),但 host.rs 中的 MessageTarget 枚举使用了 Serde 默认的外部标签格式,且容器级的 rename_all = "camelCase" 未能级联作用于结构体变体内部的字段(导致 plugin_id 未被转换为驼峰命名)。

此外,在本地验证此修复时,发现现有的集成测试在 Windows 平台上存在严重的并发与路径兼容性问题,导致测试无法稳定运行。

🛠️ 变更内容 (Changes)

1. 修复 MessageTarget 序列化逻辑 (Fix MessageTarget Serialization)

  • 修改 tauri-app/crates/micyou-plugin/src/host.rs。
  • 为 MessageTarget 添加 #[serde(tag = "type")],强制采用文档描述的 内部标签 格式。
  • 在 Local 和 Remote 变体上显式添加 #[serde(rename_all = "camelCase")],确保内部字段 plugin_id 正确序列化为 pluginId。
  • 结果:C ABI 现在可以完美解析文档中规定的标准 JSON 格式(如 {"type": "broadcast"}、{"type": "local", "pluginId": "..."})。

2. 稳定 Windows 平台下的集成测试 (native_loader.rs)

  • 跨平台动态库发现:原代码硬编码了 Unix 的 lib 前缀,导致在 Windows 下无法找到 .dll 文件。重构了 fixture_dylib() 逻辑,基于 cfg!(target_os) 动态生成精确文件名并优先进行精确匹配。
  • 并发与文件锁定 (Error 32):在 Windows 下,多线程并发测试极易导致复制 DLL 时抛出 Os error 32。引入了全局互斥锁 COPY_MUTEX 序列化复制过程,并增加了重试与短休眠机制,彻底解决了测试偶发崩溃的问题。

3. 修复 Manifest 单元测试中的非法 ID (manifest.rs)

  • 修正了继承自 PR feat/native-multiplatform-plugins-entry-auto-complete-suffix-per-platform #317 的单元测试 entry_path_ignores_wasm_runtime。
  • 将测试载荷中的 ID 从 "dev.micyou.wasm_test" 改为 "dev.micyou.wasm-test"。原 ID 包含下划线 _,违反了 Manifest 校验规则(仅允许小写字母、数字、. 和 -),导致测试必定失败。由于这只是单字符修正且不影响生产代码,故一并包含在此 PR 中。

🧪 测试与验证计划 (Testing & Validation Plan)

  • 本地单元测试与集成测试 (cargo test -p micyou-plugin) 在 Windows 环境下已全部通过。
  • 实机验证 (WIP):我将下载此 PR 触发的 GitHub Actions CI 编译产物,编写真实的 Native C ABI 插件进行实机联调,以确认 send_message 的路由在真实宿主环境中完全修复。

- Fix MessageTarget serde tagging to internally tagged with camelCase fields (Closes #316)

- Fix Windows integration tests: dynamic dylib discovery and mutex lock for Error 32

- Fix invalid plugin ID (underscore) in manifest unit test
@micyou-automation micyou-automation Bot added processing 正在处理 size/m 30-99 行 labels Aug 29, 2026
@OrientCOMPASS

Copy link
Copy Markdown
Contributor Author

✅ 实机测试验证完毕 (Real-device Testing Completed)

我已使用此 PR 的 CI 编译产物在 Windows 环境下进行了双 Native 插件的实机联调测试。测试覆盖了 MessageTarget 的 Local 变体跨插件路由。

测试结果:

  1. 修复后的 Internally Tagged 格式({"type":"local","pluginId":"..."})被宿主成功解析,消息成功双向路由(插件 A $\leftrightarrow$ 插件 B)。
  2. 发送端均返回 MPL_OK,接收端 handle_message 成功收到正确的 source 和 payload。
  3. 旧的 Externally Tagged 格式及裸字符串格式已被正确拒绝(返回 MPL_ERR_INVALID_ARG),符合 Breaking Change 的预期。

@LanRhyme @ChinsaaWei @ChouChiu 修复已验证完毕,请 Review。

@OrientCOMPASS
OrientCOMPASS marked this pull request as ready for review August 29, 2026 06:57
@micyou-automation micyou-automation Bot added reviewing 正在复核 and removed processing 正在处理 labels Aug 29, 2026
@LanRhyme
LanRhyme merged commit 83558f9 into MicYou-Dev:master Aug 31, 2026
4 of 6 checks passed
@micyou-automation micyou-automation Bot added done 完成 and removed reviewing 正在复核 labels Aug 31, 2026
@OrientCOMPASS
OrientCOMPASS deleted the fix/send-message-target-json-format branch September 5, 2026 05:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

done 完成 size/m 30-99 行

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug][插件系统] send_message C ABI 的 target_json 格式与文档不一致,文档示例格式全部返回 MPL_ERR_INVALID_ARG

2 participants