plugin_interfaces/message/
plugin_message.rs

1use std::time::{SystemTime, UNIX_EPOCH};
2
3use crate::PluginHandler;
4use serde_json::json;
5
6/// 生成唯一的流ID
7fn generate_message_id() -> String {
8    let timestamp = SystemTime::now()
9        .duration_since(UNIX_EPOCH)
10        .unwrap()
11        .as_nanos();
12    format!("message_{}", timestamp)
13}
14
15/// 发送消息到前端(新协议)
16pub fn send_message_to_frontend(_plugin_id: &str, _instance_id: &str, _content: &str) -> bool {
17    let _payload = json!({
18        "message_type": "plugin_message",
19        "plugin_id": _plugin_id,
20        "instance_id": _instance_id,
21        "message_id": generate_message_id(),
22        "content": _content,
23        "timestamp": std::time::SystemTime::now()
24            .duration_since(std::time::UNIX_EPOCH)
25            .unwrap()
26            .as_millis()
27    });
28
29    // TODO: 需要通过上下文传递来发送消息
30    false
31}
32
33/// 插件消息发送器
34/// 提供向前端发送消息的便捷方法,使用上下文传递模式
35pub trait PluginMessage {
36    /// 向前端发送消息,需要传入插件实例上下文
37    fn send_message_to_frontend(
38        &self,
39        content: &str,
40        plugin_ctx: &crate::metadata::PluginInstanceContext,
41    ) -> bool;
42}
43
44impl<T: PluginHandler> PluginMessage for T {
45    fn send_message_to_frontend(
46        &self,
47        content: &str,
48        plugin_ctx: &crate::metadata::PluginInstanceContext,
49    ) -> bool {
50        // 使用上下文中的信息发送消息
51        let plugin_id = &plugin_ctx.metadata.id;
52        let instance_id = plugin_ctx
53            .metadata
54            .instance_id
55            .as_ref()
56            .unwrap_or(&plugin_ctx.metadata.id);
57
58        // 构建消息载荷
59        let payload = serde_json::json!({
60            "message_type": "plugin_message",
61            "plugin_id": plugin_id,
62            "instance_id": instance_id,
63            "message_id": generate_message_id(),
64            "content": content,
65            "timestamp": std::time::SystemTime::now()
66                .duration_since(std::time::UNIX_EPOCH)
67                .unwrap()
68                .as_millis()
69        })
70        .to_string();
71
72        // 通过上下文发送消息到前端
73        plugin_ctx.send_to_frontend("plugin-message", &payload)
74    }
75}