Files
ShowenV2/plugin-sdk
pulsareonbot 38dcd21352 refactor: P2 清理 - 闭环 check_updates 结果回传 + SDK 文档修正 + DeviceResponse 错误留痕
1. service_manager.rs check_plugin_updates: 返回 Vec<(id, cur, new)>,
   调用处通过 Custom { kind: "plugin_updates" } 广播结果,闭环 HTTP
   调用方获取检查结果的链路 (CLAUDE.md:163 第3项, 王浩然风险3 建议)

2. plugin-sdk/src/lib.rs broadcast 文档: 替换误导性的 WifiProvisioned
   示例为 StateChanged (当前真正闭环的消息),并新增 Phase 2 占位消息
   说明,列出 WifiProvisioned/DeviceEvent/CursorVisibility 三个当前无
   生产者的变体,提醒开发者不要为其编写业务逻辑 (CLAUDE.md:163 第1项)

3. src/plugins/device/mod.rs handle_message: DeviceResponse::Error
   转换时补 eprintln 留痕,避免设备层故障完全静默 (CLAUDE.md:163 第4项,
   王浩然风险3 建议: 至少在一处记录 Error 响应)

未处理项:
- 单实例保护 (锁文件/socket 互斥): 需目标机实测锁行为,留给设备端工程师
- unclutter 僵尸 reap: 核查发现 shutdown() 已做 kill+wait+pkill 兜底,
  仅 SIGKILL 极端场景残留,不值得加 SIGCHLD handler (过度工程)
- CursorVisibility 变体: 删除会破坏示例插件和测试,倾向 Phase 2 统一清理

注: Windows 开发环境缺 dbus/pkg-config, 无法本地 cargo check;
改动经 rust-analyzer 类型检查零诊断, 待目标机验证.
2026-07-04 12:27:35 +08:00
..

ShowenV2 Plugin SDK

插件开发者使用此 SDK 编写动态插件(.so 文件),运行时由主程序动态加载。

核心接口

  • ShowenPlugin trait: 插件作者实现的高级接口init / start / handle_message / stop
  • MessageSender: 封装 FFI SendCallback插件通过它向主程序发送消息
  • export_plugin!: 自动生成 extern "C" 胶水代码,导出 PluginVTable

类型

SDK 独立定义了与主程序 JSON 兼容的消息类型:

  • PluginInfo, Envelope, Destination, Message

用法

use showen_plugin_sdk::{export_plugin, ShowenPlugin, MessageSender, PluginInfo, Message};

struct MyPlugin { sender: Option<MessageSender> }

impl ShowenPlugin for MyPlugin {
    fn info(&self) -> PluginInfo { /* ... */ }
    fn init(&mut self, config_json: &str, sender: MessageSender) -> Result<(), String> { Ok(()) }
    fn start(&mut self) -> Result<(), String> { Ok(()) }
    fn handle_message(&mut self, msg_json: &str) -> Result<(), String> { Ok(()) }
    fn stop(&mut self) -> Result<(), String> { Ok(()) }
}

export_plugin!(MyPlugin, MyPlugin::new);

编译

cd plugin-sdk
cargo build

插件项目在 Cargo.toml 中依赖此 SDK

[dependencies]
showen-plugin-sdk = { path = "../plugin-sdk" }