新增: 小程序配置持久化与心跳闭环 + 文档同步
小程序(mobile client)三项改进: 一、配置持久化(分发前置) - 运行时配置(relay 地址/设备 ID/token/心跳间隔)接入 storage - 懒加载:首次读取从 storage 恢复,合并默认值兼容旧字段 - 新增重置函数:清除 storage + 回到默认占位值 - 读写失败降级不崩溃 二、心跳 pong 闭环(移动网络可靠性) - 中继服务识别小程序心跳 ping,直接回 pong(不经桌面端透传) - 小程序收到 pong 更新入站时间,半连接看门狗据此判活 - 治移动网络 TCP 半连接挂死(socket 仍开但无响应) 三、文档同步关闭已完成项 - 条件表达式引擎:求值器+执行器+前端编辑入口+翻译均已落地 - 流式状态按会话隔离:accessor 委派 per-conv Map 已落地 - 灵感录入增强:表单已含来源/标签/优先级字段
This commit is contained in:
@@ -346,7 +346,35 @@ async fn handle_inbound_text(
|
||||
) -> Result<()> {
|
||||
// 入站文本即业务 payload(relay 不解析),包成 BroadcastMessage
|
||||
// payload 直接用原始 JSON 值;若客户端发非 JSON 文本,则包成字符串值
|
||||
let payload: serde_json::Value = serde_json::from_str(raw).unwrap_or(serde_json::Value::String(raw.to_string()));
|
||||
let payload: serde_json::Value =
|
||||
serde_json::from_str(raw).unwrap_or(serde_json::Value::String(raw.to_string()));
|
||||
|
||||
// 心跳协议:miniapp 发 {control_kind: "ping"} → relay 直接回 pong(不经 device 透传)。
|
||||
// miniapp 用 pong 更新 lastPongTime 看门狗(防移动网络 TCP 半连接挂死)。
|
||||
// device 端收到 control 消息也仅 console.log,不影响业务。
|
||||
if let Some(control_kind) = payload
|
||||
.get("control_kind")
|
||||
.and_then(|v| v.as_str())
|
||||
{
|
||||
if control_kind == "ping" && kind == ClientKind::Miniapp {
|
||||
let pong_payload = serde_json::json!({"control_kind": "pong"});
|
||||
let pong_msg = BroadcastMessage {
|
||||
device_id: device_id.to_string(),
|
||||
kind: crate::broadcast::MessageKind::Control,
|
||||
source: conn_id,
|
||||
from: ClientKind::Device, // pong 来自 relay(代理 device),让 miniapp 识别为合法响应
|
||||
payload: pong_payload,
|
||||
ts: now_ms(),
|
||||
};
|
||||
let _ = state.route(&pong_msg).await;
|
||||
tracing::trace!(
|
||||
conn_id = conn_id.0,
|
||||
device_id = %device_id,
|
||||
"miniapp ping → relay pong(本地响应)"
|
||||
);
|
||||
return Ok(());
|
||||
}
|
||||
}
|
||||
|
||||
let now = now_ms();
|
||||
let (msg_kind, from) = match kind {
|
||||
|
||||
Reference in New Issue
Block a user