From a79086e4e8762f7ffaf99df50e16cd4f9d120138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timeless=E5=B0=8F=E5=B8=85?= <1018008088@qq.com> Date: Tue, 20 Oct 2026 16:43:56 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BD=91=E7=9B=98=E6=B5=8F=E8=A7=88?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=20+=20=E8=BF=9C=E7=A8=8B=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20+=20=E8=BF=9E=E6=8E=A5=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=20+=20Linux=20=E5=9B=BE=E6=A0=87=E6=89=93?= =?UTF-8?q?=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增网盘功能 - FileServer 增加 GET /drive/meta|list|download, 每机长期 token 校验 + 目录穿越防护 - 新增 drive.ts 客户端: listDrive / getDriveRoot / downloadDriveFile / collectDriveFiles - ipc 暴露 drive:list|root|download|openFolder|pickDir, DB 增 drive_token 列 + ALTER 迁移 - 新增 DrivePanel.vue, 聊天框加"网盘" tab, 设置页加网盘分区 - 支持整目录递归下载并保持层级 修复远程功能 - 终端: 控制端收到的 output 帧被直接丢弃 (case 'output': return), 导致 xterm 全空白 - ChatServer: ws 构造即 listen, 'listening' 可能早于 start() 挂监听, 导致永久挂起 - USB: serverAttach 自行生成 sessionId 与控制端不一致 (数据帧查表落空); libusb 枚举误用 getDevices() (WebUSB 语义, 只返回已授权设备) 改 loadDevices(); control transfer 传数字 bmRequestType (node-usb v3 要字符串枚举); detachKernelDriver 挪到 selectConfiguration 之前 (否则 EBUSY) - 转发 UI: store 的 onOpened 是 no-op 致对方发起的转发不显示、无轮询致流量/TTL 不刷新、 对方发起的会话关不掉 (新增 closeSession, server 侧关闭需通知对端否则端口泄漏)、 入口/目标补归属标注、方向标签语义统一、监听端口输入框加宽 修复"在线却显示等待重连" - 根因: 启动时主进程先连上对端 (connectTo 早于 createMainWindow), device:wsState 在渲染层订阅前发出去被丢弃; 之后连接一直保持, 再无 open 事件 -> UI 永久停在等待重连 - 改为推全量快照 + 渲染层 mount 时主动拉取 (app:state); 渲染层先注册监听再 await - 通道语义改为 outgoing 或 inbound 任一 WS 活着即可用 (原来只看 outgoing) 修复 Linux 安装后没图标 - linux.icon 指向单张 PNG 时 app-builder 解析不出尺寸 (size=0), 图标被装进 hicolor/0x0/ 非法目录, 桌面环境找不到; 改为指向 resources/icons 目录 (8 个标准尺寸) - StartupWMClass 填的是 productName, 与窗口真实 WM_CLASS (可执行文件名) 对不上, 任务栏找不到启动器; 改为 local-net-msg 其他 - 新增 scripts/selftest 自测框架 (两个虚拟节点 + 真实 ChatServer/ChatClient), 30 条用例全过 - 重写 scripts/make-icon.js 生成多尺寸图标集 (原脚本引用的源图已不存在, sharp 依赖也缺) - 新增 docs/drive.md, docs/connection-status.md --- .gitignore | 2 + AGENTS.md | 18 +- docs/connection-status.md | 85 +++ docs/drive.md | 70 ++ docs/remote-terminal-forward-usb.md | 40 ++ package.json | 18 +- resources/icon-256.png | Bin 66090 -> 0 bytes resources/icons/128x128.png | Bin 0 -> 18569 bytes resources/icons/16x16.png | Bin 0 -> 1126 bytes resources/icons/24x24.png | Bin 0 -> 1231 bytes resources/icons/256x256.png | Bin 0 -> 64209 bytes resources/icons/32x32.png | Bin 0 -> 1873 bytes resources/icons/48x48.png | Bin 0 -> 3527 bytes resources/icons/512x512.png | Bin 0 -> 168450 bytes resources/icons/64x64.png | Bin 0 -> 5779 bytes scripts/make-icon.js | 95 ++- scripts/selftest/electron-stub.cjs | 48 ++ scripts/selftest/main.ts | 676 ++++++++++++++++++ scripts/selftest/pty-shim.cjs | 15 + src/main/chat-server.ts | 26 +- src/main/db.ts | 13 +- src/main/drive.ts | 213 ++++++ src/main/file-server.ts | 122 +++- src/main/index.ts | 34 +- src/main/ipc.ts | 170 ++++- src/main/paths.ts | 6 + src/main/protocol.ts | 2 + src/main/remote/forward.ts | 40 +- src/main/remote/terminal.ts | 12 +- src/main/remote/usb.ts | 55 +- src/main/settings.ts | 16 + src/main/ws-state.ts | 31 + src/preload/index.ts | 9 + src/renderer/src/App.vue | 49 +- src/renderer/src/api.ts | 38 + src/renderer/src/components/ChatView.vue | 35 +- src/renderer/src/components/SettingsView.vue | 30 + .../src/components/remote/DrivePanel.vue | 297 ++++++++ .../src/components/remote/ForwardPanel.vue | 93 ++- .../src/components/remote/UsbPanel.vue | 10 +- src/renderer/src/stores/device.ts | 18 +- src/renderer/src/stores/remote.ts | 16 +- 42 files changed, 2258 insertions(+), 144 deletions(-) create mode 100644 docs/connection-status.md create mode 100644 docs/drive.md delete mode 100644 resources/icon-256.png create mode 100644 resources/icons/128x128.png create mode 100644 resources/icons/16x16.png create mode 100644 resources/icons/24x24.png create mode 100644 resources/icons/256x256.png create mode 100644 resources/icons/32x32.png create mode 100644 resources/icons/48x48.png create mode 100644 resources/icons/512x512.png create mode 100644 resources/icons/64x64.png create mode 100644 scripts/selftest/electron-stub.cjs create mode 100644 scripts/selftest/main.ts create mode 100644 scripts/selftest/pty-shim.cjs create mode 100644 src/main/drive.ts create mode 100644 src/main/ws-state.ts create mode 100644 src/renderer/src/components/remote/DrivePanel.vue diff --git a/.gitignore b/.gitignore index c2c2b9d..df2f817 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,5 @@ data/ !data/.gitkeep .cache/ .vscode/ +.idea/ +scripts/selftest/.out/ diff --git a/AGENTS.md b/AGENTS.md index bfa317e..3259f66 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -11,13 +11,17 @@ LAN instant-messaging desktop app. Stack: **Electron 32 + Vue 3 + TypeScript + V | Typecheck main+preload | `npm run typecheck:node` | | Typecheck renderer | `npm run typecheck:web` | | Typecheck both | `npm run typecheck` | +| Remote feature self-test (terminal / forward / USB) | `npm run selftest` | | Windows installer | `npm run package:win` → `dist-Electron\LocalNetMsg-0.1.0-Setup.exe` | | macOS / Linux | `npm run package:mac` / `npm run package:linux` | | Unpacked dir only | `npm run package:dir` | All `package:*` scripts bake in `ELECTRON_MIRROR` + `ELECTRON_BUILDER_BINARIES_MIRROR` (npmmirror.com). Do not remove unless on the open internet. -No test suite. Verify changes via `npm run typecheck` + manual `npm run dev`. +`npm run selftest` runs the remote (terminal / port-forward / USB) self-test: one process, two virtual +nodes, real `ChatServer` + `ChatClient` + remote managers. See `scripts/selftest/`. + +Verify changes via `npm run typecheck` + `npm run selftest` + manual `npm run dev`. ## Layout @@ -67,7 +71,7 @@ UDP discovery on **47800**, chat WS on **47900**, file HTTP on **47901**. All th 6. **Renderer global drag highlight.** Track `dragenter`/`dragleave` with a depth counter (not a boolean) — child elements fire leave/enter pairs. See `MessageInput.vue`'s `dragDepth`. -7. **Try not to leak Electron internals to UI.** Chat-client WS state stays in main; renderer only sees discovery online/offline. Adding a "chat not connected" pill in the UI was reverted for a reason — keep the surface area to two states (在线/离线). +7. **WS 通道状态要"拉取式"同步, 不能只靠事件推送.** 聊天框顶部显示的是"通道可用"(outgoing 或 inbound 任一 WS 活着),跟侧边栏的"设备在线"(UDP 发现)是两回事。启动时主进程往往先连上对端(`index.ts` 里 `connectTo` 早于 `createMainWindow`),那条 `device:wsState` 事件会在渲染层订阅之前就发出去被丢掉 —— 早期实现只有事件推送,UI 因此永久停在"等待重连…",而连接其实一直是好的。规矩:(1) `device:wsState` 推**全量快照**而不是增量;(2) 渲染层 mount 时主动 `invoke('app:state')` 拉一次;(3) 渲染层**先注册监听再 await**,否则 await 期间的事件也会丢。详见 `docs/connection-status.md`。 8. **File conflict naming.** Append `_N` before the first `.`: `archive.tar.gz` → `archive_1.tar.gz`, `.bashrc` → `.bashrc_1`. Logic in `file-server.ts` `targetPath()`. @@ -80,3 +84,13 @@ UDP discovery on **47800**, chat WS on **47900**, file HTTP on **47901**. All th ## Packaging gotcha `release/` contains an `app.asar` Windows cannot delete while the previous app instance holds a file handle. Build now writes to `dist-Electron\` to dodge this. If you ever switch back, kill the running app first or you'll get EPERM. + +## Linux packaging (icon + taskbar) + +Ubuntu 装完"没图标"是个坑,有两个独立原因: + +1. **`linux.icon` 必须指向目录,不能是单张 PNG。** electron-builder 把图标装进 `/usr/share/icons/hicolor/x/apps/.png`,而单张 PNG 交给 `app-builder` 时它解析不出尺寸(返回 `size: 0`),于是装进 `hicolor/0x0/` 这种非法目录,桌面环境根本找不到 → 启动器没图标。正确做法是给一个**目录**,里面按 `x.png` 命名:`resources/icons/{16,24,32,48,64,128,256,512}x{...}.png`,然后 `linux.icon = "resources/icons"`。图标集用 `node scripts/make-icon.js` 生成(需要 ImageMagick 的 `convert`;生成结果已提交,平时不用跑)。 + +2. **`StartupWMClass` 要跟窗口真实的 WM_CLASS 一致。** electron-builder 默认填 `productName`(`LocalNetMsg`),但 Electron 实际设的是**可执行文件名**(`local-net-msg`)—— 对不上,任务栏就找不到对应启动器,显示成通用图标。用 `xprop -id WM_CLASS` 确认真实值,然后在 `build.linux.desktop.StartupWMClass` 里写它。 + +Windows / macOS 仍用单张 `resources/icon.png`(那里不按尺寸分目录)。 diff --git a/docs/connection-status.md b/docs/connection-status.md new file mode 100644 index 0000000..dee476e --- /dev/null +++ b/docs/connection-status.md @@ -0,0 +1,85 @@ +# 连接状态模型 (在线 / 通道可用) + +聊天框顶部那个小圆点 + 旁边的文字,到底表示什么?这份文档说清楚, +以及为什么状态必须**拉取式**同步而不是只靠事件推送。 + +## 1. 两种"在线",别混 + +| 概念 | 含义 | 数据来源 | 表现 | +|---|---|---|---| +| **设备在线** | 对方机器还在局域网里活着 | UDP 广播发现 (`discovery.ts`),15s 没心跳算 lost | 侧边栏"在线"绿标 | +| **通道可用** | 我们和对方之间有活的 WS,能收发消息 | `outgoing` (我们连过去的) 或 `inbound` (对方连过来的) 任一活着 | 聊天框顶部绿点 | + +- 设备在线 ≠ 通道可用。对方可能开着防火墙挡住 WS,UDP 还在广播。 +- 通道可用 **不等于** 设备在线:对端进程刚起、还没被 UDP 发现到,但已经连上来了。 + +**通道可用**的判定(`src/main/ws-state.ts` 的 `computeWsState`): + +```ts +alive = clientStatus[id] === 'open' || server.isConnected(id) +// ↑ outgoing: 我们主动连的 ↑ inbound: 对方连过来的 +``` + +两个方向是独立的两条腿。早期实现只看 outgoing,结果对方只连进来、 +我们没连上时,UI 会误报"等待重连"——而消息其实收发正常。 + +## 2. 状态必须能"随时拉取" + +启动顺序里有一处天然竞态(`src/main/index.ts`): + +``` +discovery.start() ← 先启动 +chatClient.connectTo(...) ← 已入库设备, 立刻发起 WS 连接 (setTimeout 0) +createMainWindow() ← 之后才建窗口 +``` + +WS 通常几十毫秒内就握手成功 → 主进程广播 `device:wsState` → +**可渲染层还没加载完、还没注册监听 → 这条事件被整个丢掉**。 +之后再没有 'open' 事件了(连接一直保持着),UI 就永久停在"等待重连…"。 + +**结论**:状态事件只管"变化通知",不能当"当前状态"的唯一来源。 +任何时候想知道现在的状态,都得能主动查一次。 + +| 时机 | 谁来拉 | 拉什么 | +|---|---|---| +| 渲染层 mount | 渲染层 | `ipcRenderer.invoke('app:state')` → `{ ws: {...} }` | +| 主进程 `boot:ready` | 主进程推 | 带上同一份 `ws` 快照 | +| 连接断开 | 主进程推 | 全量快照 `{ ws: {...} }` | + +`device:wsState` 事件带的是**全量快照**而不是"某个设备变了"的增量: +增量事件会漏(订阅晚了就没了),全量快照任何时刻都能自愈。 + +渲染层还有两条纪律(`src/renderer/src/App.vue`): + +1. **先注册监听,再做 await**。任何 `await` 都会让出事件循环,期间推来的事件就丢了。 +2. 快照里的设备 = "没连上"(按 false 处理),不做增量合并,避免留下过期状态。 + +## 3. 文案 + +| 条件 | 显示 | +|---|---| +| 通道可用 | `在线 · 192.168.0.7`(绿点) | +| 设备在线但通道不通 | `在线 · 192.168.0.7 (连接中…)`(黄点,后台在 backoff 重连) | +| 都不可用 | `离线 · 12:05`(灰点) | + +远程功能(终端 / 转发 / USB / 网盘)都走 WS 通道,所以入口按钮在 +`设备离线 && 通道不通` 时才禁用——只看设备在线会把"能连但没连上"的情况误判成可用。 + +## 4. 回归测试 + +`npm run selftest` 里的 `[通道状态]` 组(W1–W3): + +- **W1** 通道状态可随时拉取(连接早已建好,现在才查也查得到) +- **W2** 只有 inbound 通(对方连我,我没主动连)也算通道可用 +- **W3** 两条腿都断了 → 状态回落 false + +## 5. 相关文件 + +| 文件 | 作用 | +|---|---| +| `src/main/ws-state.ts` | `computeWsState` 纯函数(无 electron 依赖,方便自测) | +| `src/main/chat-server.ts` | `isConnected(deviceId)` — 查 inbound 连接 | +| `src/main/chat-client.ts` | `getStatus()` — 各对端的 outgoing 状态 | +| `src/main/ipc.ts` | `collectWsState()` / `broadcastWsState()` / `app:state` IPC | +| `src/renderer/src/stores/device.ts` | `wsOpen` 映射 + `setWsStates()` 全量替换 | +| `src/renderer/src/components/ChatView.vue` | 顶部的点与文案 | diff --git a/docs/drive.md b/docs/drive.md new file mode 100644 index 0000000..e7b485f --- /dev/null +++ b/docs/drive.md @@ -0,0 +1,70 @@ +# 网盘 (共享目录浏览 + 选择下载) + +局域网里两台 LocalNetMsg 互传文件, 以前只能"发消息带附件" (点对点传单个文件)。 +网盘功能让对方能**浏览我机器上指定的共享目录**, 挑需要的文件下载。 + +## 1. 组成 + +``` +被控端 (文件持有方) 控制端 (浏览/下载方) +┌────────────────────────────┐ ┌──────────────────────────────┐ +│ FileServer (0.0.0.0:47901) │ │ 聊天框 → "网盘" tab │ +│ GET /drive/meta │◀── HTTP ──│ DrivePanel.vue │ +│ GET /drive/list │ │ 目录浏览 / 多选 / 下载 │ +│ GET /drive/download │ │ ↓ ipc │ +│ ↑ 只能访问 driveDir 内的 │ │ drive.ts (客户端) │ +│ 文件, 且要带对 token │ │ listDrive / downloadDrive… │ +└────────────────────────────┘ └──────────────────────────────┘ +``` + +- **文件服务器启动即开启**: `FileServer` 本来就在应用启动时跑起来了 (端口 47901), + 网盘只是给它加了 3 个 `/drive/*` 路由, 不需要额外进程。 +- **共享目录**: 设置 → 网盘 → 共享目录, 默认 `~/Documents/LocalNetMsg/网盘`。 + 对端**只能看到这个目录里的内容**, 子目录也跳不出去。 +- **访问令牌**: 每台机器一个长期 token (`userData/data/drive.token`), 随局域网发现包广播, + 对端拿它调 `/drive/*`。关掉"启用网盘"开关或 token 不符都会 403。 + +## 2. 协议 + +| 接口 | 说明 | +|---|---| +| `GET /drive/meta?token=` | 取网盘根目录 (仅提示用) | +| `GET /drive/list?token=&path=` | 列目录, `path` 是相对网盘根的路径 (`''` = 根) | +| `GET /drive/download?token=&path=` | 下载文件 (流式, `Content-Disposition: attachment`) | + +返回的条目: + +```ts +interface DriveEntry { + name: string // 文件名 + path: string // 相对网盘根的路径 (下载时用它) + size: number + mtime: number + isDir: boolean +} +``` + +## 3. 安全 + +| 风险 | 处理 | +|---|---| +| 越权读任意文件 | 路径必须落在 `driveDir` 内 (resolve 后前缀校验), `..` 一律拒绝 | +| 局域网陌生人访问 | 每次请求校验 token; 开关关掉直接 404 | +| 对方版本太老 | 老版本没有 token 字段 → 控制端显示"对方版本暂不支持网盘" | + +自测覆盖: `npm run selftest -- drive` (D1–D7), 包含目录穿越和错误 token 的用例。 + +## 4. 用法 + +1. 把要共享的文件丢进网盘目录 (设置里可以改位置, 面板里有"打开文件夹") +2. 在聊天框切到 **网盘** tab → 看到对方网盘的文件列表 +3. 点目录进去, 勾选文件 → **下载选中** +4. 文件落到本机接收目录 (设置 → 接收目录), 面板里能看到逐个进度 + +**目录也支持**: +- 点目录名可以进去, "上一级"回退, 面包屑显示当前位置 +- 目录行也能打勾 → **整个目录递归下载**, 本地保持原有层级 + (下载 `产品文档/` → 本机得到 `产品文档/需求说明.md`、`产品文档/原型图/xx.png`) +- 递归深度上限 12 层, 防止异常目录结构把进程拖死 + +对方从我的网盘下载文件时, 本机会弹一条提示, 并记进审计日志 (`drive.download`)。 diff --git a/docs/remote-terminal-forward-usb.md b/docs/remote-terminal-forward-usb.md index d9ec740..78448db 100644 --- a/docs/remote-terminal-forward-usb.md +++ b/docs/remote-terminal-forward-usb.md @@ -594,6 +594,46 @@ CREATE INDEX idx_audit_ts ON audit_log(ts DESC); ## 11. 验证清单(手动两机) +### 11.1 自动化自测(单进程双节点) + +`npm run selftest` 会在一个进程里拉起两个虚拟节点(A=控制端、B=被控端),走真实的 +`ChatServer` + `ChatClient` + `TerminalManager` / `ForwardManager` / `UsbBridgeManager`, +接线方式与 `src/main/ipc.ts` 完全一致,不需要第二台机器: + +| # | 用例 | 覆盖 | +|---|---|---| +| T1–T5 | 终端 open / 输出回显 / 输入 / resize / close | PTY 生命周期与 `terminal.output` 帧 | +| F1–F4 | 转发 self-out / self-in / 端口黑名单 / 字节计数 | 真实 TCP 隧道往返 | +| U1–U2c | 列设备 / libusb 枚举 / 控制传输 setup 翻译 | node-usb v3 API 适配 | +| U3–U5 | 串口 attach + 双向字节流 | 用 socat 造 PTY 对冒充真串口 | +| A1 | 关键操作写进 `audit_log` | 审计链路 | + +> 跑测试用 `ELECTRON_RUN_AS_NODE=1` 起 Electron 的 node:`better-sqlite3` 是按 Electron ABI +> 编译的,用系统 node 会报 `NODE_MODULE_VERSION` 不匹配。 + +### 11.2 实现约定(踩过的坑) + +- **sessionId 两端必须一致**:控制端生成 sessionId 并随 `attach` 帧发出,被控端**必须原样沿用** + 作为自己 session 的 key。反过来自己 `randomUUID()` 会导致数据帧查表落空、被当成"无此 session"丢掉 + (表现为串口/USB 字节流永远不通、detach 报"session 不存在")。 +- **终端 output 帧要在控制端落地**:`handleIncoming` 收到 `output` 帧后要 `emit('output', ...)`, + `ipc.ts` 靠这个事件把数据广播给渲染层;只在被控端 emit 的话控制端 xterm 永远是空白。 +- **node-usb v3(Rust 重写版)**: + - 枚举用 `webusb.loadDevices()`;`webusb.getDevices()` 是 WebUSB 语义,只返回本进程已授权的设备。 + - 控制传输的 `setup` 用字符串枚举(`requestType: 'standard'|'class'|'vendor'`、 + `recipient: 'device'|'interface'|'endpoint'|'other'`),协议里传的标准 `bmRequestType` + 数值要翻译一次(`toUsbControlSetup`)。 + - 设备被内核驱动占着时,必须**先 `detachKernelDriver` 再 `selectConfiguration`**,否则 EBUSY。 +- **转发端口的归属**:只有两种拓扑,UI 必须按视角标注,否则用户会连错机器—— + - `self-out`:发起方 bind 监听端口,目标在**被控端**机器上 + - `self-in`:被控端 bind 监听端口,目标在**发起方**机器上 + - 列表里 `side='client'` 表示"我发起",`side='server'` 表示"对方发起"; + 入口/目标列都要写清"本机"还是"对方"。 +- **转发 session 两侧都要能关**:UI 的"关闭"按钮走 `ForwardManager.closeSession()`, + 关闭 server 侧时必须给对端发 `close` 帧,否则对端的监听端口不会释放(端口一直被占)。 + +### 11.3 手动清单 + | # | 场景 | 期望 | |---|---|---| | T1 | 控制端请求被控端终端 → 被控端允许 | xterm 渲染 PowerShell/zsh/bash 提示符 | diff --git a/package.json b/package.json index 2812d3a..8c302f4 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,8 @@ "version": "0.1.0", "private": true, "description": "局域网即时通讯 (Electron + Vue 3) - 飞书风格", + "homepage": "https://github.com/localnetmsg/local-net-msg", + "author": "LocalNetMsg ", "main": "out/main/index.js", "scripts": { "dev": "electron-vite dev", @@ -12,6 +14,8 @@ "typecheck:node": "tsc --noEmit -p tsconfig.node.json", "typecheck:web": "vue-tsc --noEmit -p src/renderer/tsconfig.json", "typecheck": "npm run typecheck:node && npm run typecheck:web", + "selftest:build": "esbuild scripts/selftest/main.ts --bundle --platform=node --format=cjs --target=node20 --outfile=scripts/selftest/.out/selftest.cjs --alias:electron=./scripts/selftest/electron-stub.cjs --alias:@lydell/node-pty=./scripts/selftest/pty-shim.cjs --external:better-sqlite3 --external:serialport --external:usb --external:node-hid --external:sudo-prompt --external:ws", + "selftest": "npm run selftest:build && cross-env ELECTRON_RUN_AS_NODE=1 electron scripts/selftest/.out/selftest.cjs", "package:win": "cross-env ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ ELECTRON_BUILDER_BINARIES_MIRROR=https://npmmirror.com/mirrors/electron-builder-binaries/ electron-vite build && electron-builder --win --x64", "package:mac": "cross-env ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ ELECTRON_BUILDER_BINARIES_MIRROR=https://npmmirror.com/mirrors/electron-builder-binaries/ electron-vite build && electron-builder --mac", "package:linux": "cross-env ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ ELECTRON_BUILDER_BINARIES_MIRROR=https://npmmirror.com/mirrors/electron-builder-binaries/ electron-vite build && electron-builder --linux", @@ -60,6 +64,7 @@ "output": "dist-Electron", "buildResources": "resources" }, + "npmRebuild": false, "files": [ "out/**/*", "package.json" @@ -105,10 +110,17 @@ "category": "public.app-category.social-networking" }, "linux": { - "icon": "resources/icon.png", + "icon": "resources/icons", "target": [ - "AppImage" - ] + "deb" + ], + "category": "Network", + "synopsis": "LAN instant messaging", + "description": "LocalNetMsg — a LAN instant messaging desktop app.", + "maintainer": "LocalNetMsg ", + "desktop": { + "StartupWMClass": "local-net-msg" + } } } } diff --git a/resources/icon-256.png b/resources/icon-256.png deleted file mode 100644 index 565a1147922a021e1a4d84cfdcce048f02ef95d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66090 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

0UA=dZb=%%+K;)^@8A4>?Ji)&HB2CHR|n zbc5QBoyI=i@E?=MOLb>e0a6;VU9t48j5yo z0~EPJPLMl7cBgOMZMOTg+j8qKf@RdO?dP?R>%~05)$d79&$BJU2b-kZy2}lBuJ5;! zdOSaFZV$$@3>t*eUB*6G=C?V&ZR-> z#%Y=ijt^-G387gOWSg1LP4u@~=vR=>$NZ$eog(Er9>xp{C(27xZMJ^c|0|xlbNt7( zE^v}>*f9uo_`N8zI@jO~`z&WO?vguqnL0+VN+pmTBBk8IE_z6Fv4uE}v44G9miF02 z_VAPp{*ZT>_)8mFIj{rv^yHEV2}P+{2y^Mp*0rF*S>;G9M&8MAec*{XCe1o~;`U$} zCG07L^0}MFe;MWNulF$5bV{az&lVV6_8uEw0P53pUn=N{(F6 zMAK(m$Kt}!nQA2>#o>#_52vOGgaXtStGFl{^9*AIWXwGiZnOm?iXXcBGT)VVJ)p%k5}a_8jQv;$ibTR@sakGzi;>I`eqX}d053kA zSgy&yagH^Cf=c;3GMv1r_8YrTXd)ZM)*&iEQ2#MA5T2~B^~EYr9aav$({e>jbv^cI z!9~6IyY^q!ztW%%Nop}CVQfl5lE~09#Nl35SAf5+09uKrG$G3eO@~-y`Jw6`C zb2u9}3Z%dNuI=v&UZiO0e#|eamarxJkl`wVlQb^0=0#FB)65cmpL?YcW}>)GAq_rQ zgSv64j4<&Fb9G{Ereu~;9=#l}By2^tVu)7=}8;YxIcYvKu03=66YZ?B>gL-mcRdUpR4ux zQnek!GN;CtiJJ{xDOwhxQ684D;!NkVQ`96E;cvI@>+w zy_^-CM-=53t@gl(JPhs^Guwv53SId`Z@({f$s)gDt=)czB{+peS@V`kFfiso z*@JG*NdJ8qS#dE<7z&F+Lm@o4zxf5Pn zdNCa?hV6ucuz9UpJgl$dF%utgt6lEIAzSKD*RZb-6AqPUX){@Or)!@3_KrE;-R2?y zDVCY4FpEZLTX-hlSx=$d_Xw7H*u&Wcn|4T-~9`A>(DWLh~GR5q8A*K-TFc*NB4u0#nzD9(^J3KEZj5pC&G4E-Ys?LYl|zR zwyORrgZ&}<&UW`l1{X!lJ#;pwj6R;R;q=&j9Q{AOP_#z?rd>Ec2A|jC8eta8YGq~G z_WD6*jPJQhhW13{JOx)-h;)(+3FmKWag=uxgxeinD&b#tOH9!*e=W#LvRB2+INp0BEOraLC*6=Djm8rdjmc(cw(IllTgzzd93D*i2Ga^7w#+{wq zTeHJiUbipnOh$Wxd|T|$*PL%rErUJI-T_*ho~}L4v5tBnL4zpllCPJk{QdW#>GPYd zXcHJS(SPJ48e%;ZC5PmTP$Z*azAx!n8Ls}xB9wi48EGL!O&`_vUz9M1>wMK9vaNP< ziK=58pPWh2Pqh*V0zoC+-Thi+Y<)_*>7G1tmbdUj0|YlC4KT5SK;RSgmnV4H><3I0&{3iuhDu#mS*W2L=J zU&htH+w?=k%7e7l6Oi&pfde-B<-Yl+ zl*|?~wuV4`S@Epqc%`{|;+e6!%g8P!sYgLp%u@RPh>O!HzCV8Dn0tIQqMbuS*XHQp z;1KtUdB3ybkZPHl`Ji4QIoy1VaVgXQcDADSgxLx~iSxLJm^F-b~>0x}LhGy}P#N0S4e?G^4;yT_7_9Ok-X@uZ+FOsMOa zZXwXo-mSd1`(?YM)9Q)MNR_1MINdDv#Hmn)A_rxrfY(=fN=GvbgER0J6{S+>$_v-} zjFDpxbwsoDIoh{@#KpyNBLOuukdx-6F0w|Py4{P_J{kZR0n~GXJ+XCOT@Q<2{bLh( zMaADIMX_M&ijzbmb2}w?q^@2rwd(tOQsB=caok{vet6(l_GvGa@`SjIy2eL)!n5-S zL*7flUm|n~ec&sFG^0!abujrDlJ}b%xSMP}l0LlB=n30`#3LX5F^FWLRo`00ERq88 z38;fO?m?q*knBe58y?ob^m6U z4@`uG2eHt7}+?7s;Tm&db54lE|TEWp=Xh*9rhhZ42G;I#1FJ%dr{FcTx% zm9)P5n%hlM8!V{xGl1^qg)KOqj47lJqJ~lD`4(V5#3f_R5EGZ_`|=*yCKM->iTlc1 z{cVMn2ls$KYoecV=C-cj0(EHA8k|?R|Gd2#7FB~D+O>vHcm`SR&QnLw;>~RQ?oi6n zH>ly|Y}JK@!z{bqr`xoQoA=PO?#}l4{P;<4RH5REnw*ECB4M51=A>tw1o%d{H~fdg zAqQiJE;ZeJZND~;45r>_%_taa~W7q|Il3a>DG3lljWG&`ZUk-RaV4?}lq*Kv+F>3WXS#BKO`=A@rhL`9+J( zu5BT3EY-<#Y4YU}Nsp1w2$QwwJ8 zU~J0pQ0ZKP&>q_62&&IgItmv1L=(J+#z7`R8hOi$cz(+%&En*q11zEtHu*pAVa#~> z!!3{K^Q|pSB69Myb(W`Jx=zrSj;uqOkY#kL_7U-pPQ_(un8Ce z4v1Epk0HdP40-E~OYcVm%Z(~&(8TEuLDG>*Nt#*xe0`iIEhr!|c0ny0x2VjzSx&~_ z+iu$8%%&mD0^QwORtTF=TKPM7sNK?7+=7{a_FnYdQG??T4cR~0-y71yfSViZuCXyk z9^t8!(K6mceBQD1zv*l%&qP?~uO#pS%Ag45zbe*p1nH|qJ*^y7twvZX?L|TPWFl~n z*du~}(QtgAq=8S51dF9I^Knq~j)V{x_6ag<7R{~OcVy+ykeg^0MWM@O!FGHAMeCL9 z5fiqT+RB~3YGpM?N+;*~R8dHHywSasajt+raVn#{7Pi*hXyPA8isxh!hSvY-FX_wC zY;|lE5%M#6l$?d#GB_^4?p;Hjxv$=^p3ZtrdCy!_BI!@?o-?geC#o1+GSH^T{C>38 zGWs{nYnBL(t>r=kk+y|^XGW1VzqlDE49p&St;JM})gS4pn6sLST!;Z!vcuH|o{>C% z0y`|x1Zcu4|B)L;kG|K+(eyeaf>8cGL7Y*RzhD?G>Ppu#6}TD75h<#dfi;{pJl&kU zh8?=MXp;FI>LxC)Rn4|r6=f(m*?W4+;yuosd?pXr?)6ZykD$58n-YpNWZ<40kaOh0 zqu3U6D5!znM^Nw%=; zk3E!!E})CErQvF@*?KF#!g;sfGw!RGcXr43_la5`M}(c}c3*2|>TLcEgAnmc{WBU^ z@-@$@82f3;9LR)QN8{$aY2t4UC9Yr3!yc>sjZ2fpg*WDc_QM03!867&!h$6n_{)m# z!EVLzZo_`#85cvtu`=p$OFA2878y@>9@n{J^ZvcJnNJ>S`~k7H0ZpeRxC-;4k&LF* z^B2FRdf`OjGG)j`fS+{2!hG0&Q9xTmrX8z;=zVBMr*jxy^3 z6)b`9@DB^tMZDc|sFg_tq#?SdAur`M&tjMkv1O}erf#(+*v)K2_sjc~Aj!0X_WAaID70Dq&3@Vvtgv-P=ULL zA|{~r4O+9#L{30seJ-In3)G#AHvMCcpPIZpZ!+j1j`LK!cch;81EjI+dl)uG!!1VO%qojqU{5ufu$6cVUZA?0SI!pp2hf_f({VC5{bXy@ zSi{FUe?p)k`Sh`yv-H5k{>Y3h4Q1~8Ener6>ZDb4(p;zL@R$HQ{St-Ql4RR@$T|)` z3UTN64?S-Z9+YbpxO@uB&EI#h+2Y)t+zVJ!Uf#;bhhHm&ko~0ODMtD$kA0C+&GV}m zB#`q-_5SjBg1yCGmDh1|a%jb3U8~`!xe5FnwQY>%{g`%%;KqIUP4UGX>zilFLGFi# zV!P$B7Nt9CyK}`Zo6Mr%AT6k+<0S<7Z``R5h*Bq)#v(QiWP3C0xu1>fTh^PYalZTP zgjhG!bC#wCm)=hS9rOcx!KtRbW?X{U!||+0SV4;Hn>Lq$DzsF_-Eg%7`KAby_%Rng zdHNNnlna4t;ZslaYxpQtEZa!+unj}oYn~&POGBtMJDP+!vY@ z7z^~la`ZcE96Cx3-_uDy^uXgG$`!aXHvmRySiq|GTirD`>lJbV4O2smf--x1geJs^ z->ZIjQ_d*YPhxE6o9>2FCs4mfBmVWgqTxEC8yklH9ex~+Uw6<9=ypE1+sh@_!Co0Y zTLGM4xy;3E3&d_UFs!y>QK}U?+$SvxA-cb4WIKVI(ngXG$WFU_V`|#eav5S%mo( zw05x;zS+R^Iu5+rfM(h}$+7h8-7i4%Z_B%2^!i~yl-;q!YNXvk?O9+(<&sL{&hUDS zqJwA}hB8={MqNet$gV8z9{flOgOeW;sCE+uo;e~>O3AoeK2ttc zV;O#Qk_D}9sVip03=Ko^l_m3H`XFU?Za#d*JzJ6rziEZ0?uO)xvMD{65XIAu$%7g1T%t(3I8 zXL;*Y^>1cK78bJ5cgi0HSE$p6yZ<@@M%M?ms5_4ussa(A2yQMNg0>;c}hOdJXNvJzSWR!@qr2F|KWJLBk(n&=ndpG_9vi`exJD5@$E6_N>6u zNDbP6mX81#XwDw>^^l_u`xW+m>>P?cn6) zakwotOt)dM!`d#iyDxSSC;eAt%wmr9w_be*80j2v=n+1wh|F8|^fb+k@?5g_XGVnPz3Ov;PWOB- zSW2wyIT#w*|0>%wpKay5vYfL@39%0vreD2RNfk6*7nUei3r1;t5d zAB8l?Ii@;0@&VKQJwii7wDF{Tp@pKaRKpBr1;SkC@|>Y{v094L-l_T^GxI(dFG&~O zqzf@+*e+Tq{v2)4<;UP50en{JzG3x^A2DV!_l-pC^a_Xhi6{(P9Fi{i3f{b9sX`Fp ztn)?2%Q5~edpJBl$!`xHK)jrkQ`C?aW_52Q9K&gyXlTgGlj)-<0_86{+TBy9ANUr7 z{O%8%zo7#>GiQ?2Rija1izn&rioY`@WOkwpUzalnHd+uejYnTAzqJceUFSfk{BXb? z){evy(8N$wSj3??Eg({4`;(VuEfi|S522L{e4U3WQpZtZv*Y(eDY4phKWtbM798;) zQnEKQEEHM<1qDBF{jehho6y*I+=rpN_HUIOA3Jl${f3zwFc*HFkZ-JxF9&l)^-e?cve;go-^wxi)rQ~3%4%0I3@3EgO_I9b(?h>WDcj`iGY0vQp*m4_de;1jpImwcNn zC5g;2Vv;ykZ8eMpcibxjdSeKtIdYv=xi49>@cZVW7T{?I0il;dT*rrhB|uLHs&xs< z4Hu)S%EiOi!yBaMt3qral;I433x&nd(N|q#B)RtBftrnxn%HG&T+XE}0TrPQQu=J5 zlM|mb;l=0vRNoj`GN>av6eEYVEh0$ABn*LsyAV{OkGNO_q4OqWAfB5-Jl4d10JIw?VQ9brkJn99nm z(uY$~Sl)>Z$H=n%y&^{*lnReFqab4Ooy}e?`4XRDy^J*vK^RSiwmd&tS^-EGQ{@y1 zP9KO)$ff~TAAPpmB+i;nDCk;e@n`N!qY)IpcO`{QUoOss6h&YbXm*W^8>uitpdXS1 z6&F%ux_#LVADc68sY{Ea*)8iK7qMmGP+!PH5=fszfrqd)&@RiEZ*EbCZ>MGz8D;R7 zuwNy0<@1#yM(2Zogit$j2iD9!Mz>CkQ_C#5{u8t+S$0k`uD!!fs%08coA7h6a z#8)Bf3yCc1sj{xgwDGiRQrLUaa+Vyql3}oZw6|L9^LyjG=6^JC{QjKR1D-KukrR-JIF?WwKOa@wI8R0Ds#h=Fl zaJK6tno6`ccX#@?vZIDtt!~qLVsgKucrI7>iqnFjPfzh3%i52#Tx7~TyTMYsSHdG! zQk9RfpVF%mx1t~Dr$d}l*vRN^b%Hdy?QUl&Ixo}-QDIh8(W0;hk>wpgk;8KGG?_;h ztzM6d>-}Fzx3k1}=r>~@vBI_FguCC~X`>%RC``CT=L8Ct)U4aSMJ>pkAMp?waUX?P zC+uOk{`H||uE^~69M+d3IU=$Hq2KK;h$=|$s4NBmqsx~=N|TW_a46=AzV=ei#O0gj zCra%?mQSg`7M5@N>}OID_G>Z&rL}bsx-?XnQ%Kj_C%aXsM4OFOM9eT9tTjs>O z#-$>|TN>CW7MKq@2%?&`)BtN`dA%k^%>9i_A80s3%ToDaoOv+De$SfgOT{Yp63&wQ z1=oFs`Dcj}R@{<4Ae=x`iZB$^z^HwY%9&fG+PH8pEg33B$ElW7WPj(iH*3MeW0VSD zLT(l0aG+hr$Pecp6zT^Ls$dbWY(g5M{H1^Y|fa% zKU{B$kjm0Q5T>2TyFhQ40!n=LqZ=?&M>nf8QT?J-`okot&?3upb(bdDD1|L$%!&+o z@tc2rogu1YCoE$hhlysi7YEyYK4&8Nm$2(TKn{AFTGSX7q_$d=$~D6Y<1b_y0zYKw zf=b(yD1>izf%cp?l=6C_(x>{Q@#+j}f@b8@=33iK?uR{GZ%#ANMTtZY3U))T``(Kz z^>g9_?WBSZhVSFqBq7_C`4_|94}X-H%Ib}2Avn4AGK_H9xEkO`PosHvLUGz16(_J; z9KJ%4kryrt9??PMT}nxx=<2nG)hfiqhoj9L66D-I{g6ZCV2cMMkG6}(!S|Le`HfM| zQzMi_YmPrk|2D6lK2#Co9_2pkaRhfdbwpJ|##jHsx`$s|o!zsTQ8LPHeVo}6AZSkK zcoJ&^Ekitc!l+iPE5o|%(X!&PFnEnqMo#nar_UVx>%r>jrqRQk%^$C(q>Jd2G;OJ( zLA4L`1zA7Km6YtAo6Qwgnb01?+C2YWj^-3=SETRfn6aKZ4ei0B*Q8ND6cO$gm@zr* z16;JHvHEWP*ij7~*zW$Yyv*5B;&9my^RTR>Na}Vn(!Q8}ojt5SDxILq;2!Epa+| z!f}OeHNm*?T07XJoCjPQ+RN-qnrM?9+z+6!>j*HW8zch(6(k6l@bePDaG4nE7ig{2 zBFTDcpq$e;M2p=1R_)y4<;E1EECc37>O{jwaE{9-8|$f7QH#6@@pHBU>y9(Sd%rbbu@ggt zHyglizhhVQe*jHDvcG-D83nXRG#mnKb0Nf0qMib{iE_tPbY5Vbm4ff{tgBi*$H_u(5xP*S{uY88F&Gc+tUDp(e9cM6OVl9ctYqqK?U75IQUb+wqq>B^p zXl|Gs5R&O=urp(k1#v^I2TEv4Pg|^jT1R_w*%KnK@t|}Odi8kJAi(r27sq0|Xw_1% z&`1mKHvY2L_ED?#?P{5OO4YK8LViF7)0wu+X((O;8DbX7`i0 zKWnw9KxhM#l=*6@{K8ZOS*H}=c9qSr(}o{mF*c(KjBMtn)|}^trykQ7{FC@@%vv-I zQxi^Cr7eQ;0r3C?&UG}uNGq6x3`Mck>1M-PsRV@UK7zNICQQmj`a+c!leAw!vz%6Z zy8W8Gph_%lva#FUZ^Z{2?tT~{rZ8B%sL& z2tEsVbA*f8#$6~H-m0gee42fER%2T)8HR6#LIm^=2(5MeCW zjUVNe8?6YKj}wM8%J%#rl6lIQFz$7`FcF#f;63Dpm=;vD(@Q;M=FD3ZZbpEL@yfqmlAoskx`urLNh z6AWk7aK%o{(SC{O%1%2^Eqi|M(a!(wnKOR=@yB@T6rL7%1mnaFr6;mVL={to4pv4R zHTpHSW8VQLy3z812Bw~*ph}M=a-*AD99d4J%q}>@@b3YaU*!dK5`|zIZ_2 zSwxWlKccZta0Jp?0HYT_g!Mzp!scf}AcwgEs8O9dU`D_bSW}JI%imYuDu(bIZCPn7 z@lldMs;+)(2|O>Y`FpDmgt6&I2z3LmEyv3mlv0RiUWZ>8;xqz!OjD=% z&p|rP8&Qx|kqM^cxU*ZsrP_7p`k`}ndf?}tX#CnUAK_OXYkcaO@}wI(2el|Y(&~{t z%v=hl*PaBWztd~p1ZqnlTTR0zz&ca5HJEkjQn7JtYw~m2nUk}fkb(Ec{1*~h#5pmi zd*e}or&Rd4k6z=iKY7a6p5F7ny!aab-S!hHr@@{ABtm}mf~%|JY7W>mk8Yi5dUYKORDO@NTFK7}oo zX9$oGd%2;xYjJqZl5R#%;f$D0F5W)4Tq)=Q-JBjlue^t*GFcKjmMW@s8-89YRZ9eE z(GM;%19Rh&CJr1z=sZx%>kjywXFFs9zw;Zh&7G`JoicP z8tlPT2K96!*PkC0Z$`=-N@Ua2Ks27ONvxHnTpE!GjC$@~b<~{p-5(Fh1Mnz92z(oh zih#c%?b{0xTxny_f zn8&U;O&cyJ0o9v@PkrcM2X+=dqqoLkX`l;_89m6&R1#sGZ4Clb!)8nhf--q69pK<#x|1wXaw-Jx4lPezy|nuP2ecHU{& z(K=O&wZ0;l%GuRXeW%Am#{jVDm%D`qlWO%XhGhmvGbd^#{OLE1CLE&!O9$WOblDK( z%#2VFaOip00hPA&fDsz@Es!LCQ_QYDh#SLd*r3e}>+28%4e9YcbKDP{I=Gx*+Hk+* ztli}kkL`GJ2hAGD!W;Vo-@a?SdFU*waueedPr#Eq0u3$7Wp8}<*2>GPpsR4A&NGh* zA3ND`V;>Dv?=H#@Zg-yBJF7Q#-g)-)z^Bd{CpkuIbAE8!_}*<{PX-4ed*=t?M69#3 zOFnaR;lKLib^fC#7k;)m*Se?W_N4#LL!_8{B{ZoTMxb#6yT`z7*2$3uC=IfO>2nIM zUTR)*bBVY3{Oa|6^Ybt=e#|wAqMsm@T{GvCBK)Txxxo{nG`+*WeDMyq)<>}&tgRTD z8)fJbrxFBNHP&~F7z?stdgl6yzKq56lj%YQ{7Y1k@7U}7RNk@@9E7y`PV@?JJ{ScM z#|GkP_?=zJ^iPD$y5zM5+5yIyqV+P?Fs88@Z#$PMFKQ@(lU4sX~g27F}K_**}7 zgI{`LVV8^f8+V=m@!y_v@p9+dDm;7A`42yPouB`xaxD?etE=!2{^)`ipF1F&aARlu zwNEenji+}!mI30|f&clN=REhPcTiJqYUeLKd&+u32HvK4sbC1>Kik!)2933hS@wP}bpv3WKSAX6j z3^^9|^26)AtMQm4B_UVNKl=UE4}I8+6E{AMbNa+7rVE$-HeY@IHh1J22Zh%2-d?bt zp|v6)XXB>vy0#g|3S`$$q^FYW)q?;nQr(J@3!?*v#h6H-$8sJ_J|G1k_^l%U)R1Zh z)?!@3FI~O(bN^gApy7HxGjL$!^@bt|cuWRG~`t@7n3TP8FDB@VTnM2uavITYCxTiqn z<;QE47Ab!~oCSDVj4wU0@bV|F^V03xd~3gFv1@b<*6C=PI!zNOh_{H{2vjrNh}Ngr zk09XWv$&HyfMe}zVyqIhrkzKoAl%eU35sIUa6U*EfZ732^5wEUbL1^RoSg|Ph9!g+ zH@de0?@c0BUCkq|V8;6_C1(a&l-ctw)N{;pUZXY^t+5qycd#v2JC;cFBWPJPlDXKJ zNp`ky_T+)jerm_hTvIMDJ8xX9bd_j6qQXn-!aw}Zfzx$QGo!T~U5qzf@#PwK5njaj zhu^--zaWSnU7Q2TZC_wH!3E9_&hLKrlCSB?ZjF{tdl6pu1#hRgz+Dr5|2gMd&+S>( zjx}SI#-%sz$O)FIK9f)gts9T^&d)!!@K-;sd~%6Ey{|8;hS!Hjlr5pIN(V zvG4Qy@%;jI;|nrnE!$_0^R^e=Jj?N~B-6(e*4&E@LMW>(`O`T6{zp#u)-x-w{^^^% zXv(@=r@0M|peGy%K8fNzkW^DJ&&G6{sHhjUTiEnK%!d)dvzc8di?EtvR_Vnh(X*qP zLB~R1?|9yhkB4guE}ZQ}26fVH20t7@-DsIcYQAG76o9&8-ZSE#xmKxwO8MtNwoNh} z2AZG+hac=0URk3Tn;GnVVKw0*T^;lA!`D{Cj@Z?8JuJLY90!N4LKkHPuts;| ze6L)xWJ=HIYOI>&um%T%H>7dijnf`mu&ufaq%qb)p{$M^Zu9J7{LPO&&R@I%XGPtm zbfer0?Kj8O;9bl^`Oh1)wGpsFY2$jnU8ZHJ$K5lqd(~;X`lB2@Tt(UEvhZV9W5fjB z;(dJcow{bQZ&*zD>;nJZ)2IB~7Z+Z><1~yWE!SSpb)FfTs%7vs)|YMYONU^*+IVLl z?vsVV)G!Fu4akUkjc9YBxyMHCC7#c(k#TyS2Rt4Q0f?WWX@N6+)zY#zk42)UsD%(0 zbZHqhF|haJue! z#1H(!#~M%EJmC*taK3)0)0f8UhZDZ~!U1Vc=Nes>@SVlLT1=7%D+`{n1E(647S&jS z;3JYe0Ueo-=8pM_p{%l_N_SiVdHt^hur4(r@VIo&o80Gn<8oJG1Xn`_RnI-H&vapi zyE1OFMHJiTmHYf6zH`&yubef$_RLMb_no`E&{wR*9FN@&O(H-yx+~Qjgd!=n@*K_F zt=MyiVu`sI6HpyofvDC5mJFV|V=Eyy*%>L8xPLG_fD%&kAht+lkQ92)Hdr~3YRZX6 zu&QUus`d|<+0lUZTSH>Hol?>Oc=mQ@u%m`sUjdm4rEZBP_=r(RE{td=6%8GmJCB_> zfBj=O_*;MBl>If~`~41l?=HTa(ES9rUG#8g0U`Y~4Q{u4ZgrNzeiZ3;f;N|3|9r_< z#Ds5x)70ohC!IZxX!PWBf=OnsLlFc)DGOq({k*(mQ#l0U%YW#aMfpYX&di`?symxwRToGVwa#GJC<6)1# zRX|0qp5t@PNVo#eEbuoze#$?6Y0pcqt(cy~`k~UucvuyU`KW-)gU0~$?N52@BVbQdd|AODiM`BBoz5Bpn%!zD zt=5S&VDpaT-fhJrAJNtP;|bYG$Xt86dH$(Eu<==ZXkNYfEm?7)gPr7YOYjReq%%z5 zlaKBA_0OI1krUzf{%p_pUcE##8H3sPpnNnpqLR@9$(U3IBiLKDKb$5KDwk!Xh{VUn z7Ks>#Kq7)^aVJVZW#ezg^jXpcO`O$3#W~?KdBV$^cEM-Pj9+-N@zI{5E;Yh$KgZkD zT%zO6AtN9c3MhoYx0AR%e@xu?`a5}ycXhm7tN};?z4ylR(R2v%sXJe|ru@Q_J058k zJN#NAS`Uo3Qu{tQCY_E&2jflFs#@B`H>yLBO`Veu5PJazN=)8Z@B%93-8$LTf$q@x zfU*E4oONu|@FNz0R1ggiG!a5r>t1`P5v)HpdC)LEHt52d(N?ptifP+poJ#U@^x|hv zqg26>L?$B4%`juYEv=S&0y%fO?UB=k+l%lA-@U{C{Ea)j+)qQ}CwngZxnv-Uq81Gs zL#b%ldDMJT+#|>l&uW1TDt}(qTr$e*9^0yihHq2L$5~mXf~G+HsIiu*Ke@w@nT?F!VW zM0lV|G-688JX8^td&d0T91o`eDB7?tQ-3;ryINrSv|Nb6t_dLSJ&vi&yPBno)0Jeycn zahD<>U5AlsNvoQzm+jE$-dL9gv~(qmRSyy5vxvTjg-^j89bsh1PnAN1Ta?N z=?LWLs7**jA%aWC#nB$u_i|a{?b6lBAxjt$b>z{HPl#fXox!6g@UiQ{Nm`Yw1yV=H zef;7-Pscq9VOZs>pND`2Fpcqgq`_k+g0e^0;~}y*(FIvd()G=Fm>P7UZMr8N`Am`u zNOD~!Ug+jDoq@rkwUt>28SvaX-0t&I@BDaJCLlO0R+VcGy~=xo^w7=etK++PA*q4z z44HW9U=3b?ShV{pVW{%j>JwD&>iM_kh9fJRq9QN-vE^3zL|87tJ5a|Z`p(~^b9M@s z-MG6K4o%ogkLQyG_v)h;7J;l1EI3~RFEBcFOF4AR=TR~PlEKO7MNohdbbGC`LevHz zLN&=8LT~xai-Ij(T6?J3`3i)O5P^%Cv zrnj4;&4(27AYRTjDnPg;3ipSngJ8r zG|wm%;W;^yQF|}N5%)eyA(imtB}|6V9sXRMSEQrTzG2x{KKHotYd>?!_g>la55KeL zQbS2#3yNmHN{b%zUN!dZNbu{(a0b=KFj!oLm;#whJTQIm3gb+5;6vkY;~oRC`nEYq z#Dyy<74ZlIS-GZgP3B||0?>BIH_yI3-fu|%USI#63jTu}4NxVvnlsRrU6sVgnur~J ze2|HfoSq=mque)@tNQFnO~uZ{(yt#LB84zv>M6H~e?_e5!IOCpl?E)I)rh||18L2- z{A;Nml^HWAP?P(#kA@DLZLd@KYeBbK{F}Lrv&+VNf?kG29=>>K*-{eXm>QlrN0r!L z?Wya+Uw&Hn!eh#btO>@FYMXLAVI!z5s5^_S!CtfbSjH`*E*BwM8Jl~R!Jo$?P-8{o?-hrE z%QVV}!#ND1Tl2HVC z5i^K?e?SdEa6cE1>OVZlKbT~G-7+1eiLkQf8M5boCjGsl^%aWoq4ip&*T}3ur4~2Q z_Bp5?`wvQ3KE01=DUwDjHz96=(Agoh6?ETeZqd$+806~wI(ihQl8R+BdhX04bL?f4 z(`gGL$Rh2~yj#eB&#{dGTq$FQT9pCqm4%blQCrcf+H2{4x#Ln9r$QEWnQNB_^)F_eIn4^N#!|LlGy+9!K0lO$cp98PyBUGVAOW$~}a3Mi# z3T}bYeL;XGmdGUY^##&B0&kVVOW2eB3?nFH;&?BodX|jVt~;ZO5l4FXqfz!e;{ml& zgIE+lnM-Ukknw@B83~ror*N^tJ~_!f`R%e(%xYi7B87OccObF9gSSmXBq2IUB^xlCje5!lDM#Yr zO4AO=2ZjKc3#m(N57jH$-!=UpgKS|`qKsu3u-BGHsm1GJzJbMM^|e?MfFz(7KTZ)| zd9FbrPE}e^e5;jl=qPs&opXn~ZHMUrAKhHyOt;McU+G(zN&ZRpII^Y1^tA@^4nsfyICz$$Iiy%=7Xm9Q-JXw_87w?ECR8o zh-OAB3g3o%Nye*4UcW?+%<-`^^4R}^X|oj{3S3*5AFP?=feN;jg{B#7Y)U#GG%^B zj;jdbDk2z$hEUkGXW+0!zJMvHAjL7ONd8vA3P*}pr~gT zV|^^dcBv-%K~aGNc30Drl~{~!J@$s9;k||bA{{Y9SqTqymz99Y4v;|$ntw~=$m4{G z5+ajVsVt72$W3s0bA zkFG4Ddm#f$0Z#!=xH0|JY0<|1ei9r5EJbN@dGR&4)vF7zBQ}F@x<>zBFuM3?aN-g* z;nPxh1U|96qz;)*+kMn4V^&C3T!3gOk}u);ZryW_!O|#M&J_2vSPZEjM60nWh+9I- zL}sdJi*2n}5f;m3S-NoJ9>uCsewt9g+rVNN+oPQ}+l#Bq$CRCOFd7hV_i?``lr?m`gD`RcXX_So6=W;GM zl>;AvxQ1dpeQJE+qdVT*8()9LxD<`zi_Fi4KUO^NQcl4RloHrYT5UYBFsP(n$|v77 zXvMYT@REU}EFl;qpHh0W1yvL;Wus3b>k*uS+C?~Fp$qCQh*y@)PqyZNdu06L9){*2vH9K%g z(v5>c{=xJEFgUY#3aVvM_~3?iM|)+;jqW}8_T|T>&l;N~#xl1n8rae?@+z#@kY*r_ zVfxYL7XFadcLD{BI6*1~_vG*7tvXRa^XVsz|NNIv_$wb5c5;VCqYprB;F*LIC&r+5RxW=sjDb>w6r);B`+NyzO9>@%!RqB47*T?% z;g6c(wqiEx%0HCv<74zMxX1c$S6U3)npWLS)1~xeu?7#o#8@>uWJ)8N%|u^^y2i-b zWS}eMR0^<#g2x+{UPrP&fpcwvN7Xr5 z_o%N#Ce{<4Rndhf0;zobgv=HHC}+Aj1J(W5)nn61B4rxXQOU+7p~)BDK`MiIl?Xrv zJoG^WwUGtcSetrQpn^@+_|%eEV)3gQ-FqkWr%*X;vrI=v&B4}hw?F{4QQ~ffCI`Jp zU+%#+jSNx6zS8w$9a$RB^}BTtM@hMB%(GMv%~(HP|Mm)yJ0|u4wFMW>1Ma7Yj`&fL zA$8Dcg(ws59ST6ZM-)3a(8utz1lPRSfSX~Ggf1h%AC}t6oge~ZbtkCjn%bo(n-yJG zhf^1Jt~6f|kKX>Pghf?fKznkzi}h`(rKfLQgbyE9S?2$<+&Nfe3?%?yHv1)_8F=(k zh!GssN)uGxpGpBH$x8G5A?cD?f^?TM7kxh$VA#9&kxT#Mdc36)*q%eQs#jSM*;7ak zH>?MF%8x23XVhhktureBCPP$E@j)+kCsK-o^q=)AU9orokgBZ--i~|L3m$C>Zv96|vo8>f&qLwicnJ*_+^oYgupa_@ca~#p+%2VCpK`ovp zG^Yt&rBzHI=ec+S zT`czb8*dq|LQ`Re^=;D`*3*}FD*0I6K_@Oc!ND;VUuBE+4Q5p zca}X%`QD^upHYCB^2xCf8#NJC{~y86c+pPwH|S;Ur;jSbHP8t)A>1M=4V&5~az>~f zLUCBdJqoGZ|ERBypMQ!p!aXQpP%z_vS{AzZh;8MZiCU&{%P-%Kua5vQ;-gxXTp6Qx zfX}vh4GCzki~zZt<6155H^ev-*61pI_MOhz&$M^HP51*VfPg>#n-LUoYVUdJ1o6kK zC@6w#5y*3dC1A7ErU}zOoiy8EzExYKN}E-jAdc!fOy*wWQ!T;BAlXcuK;`}|yBHxo z^R$gWeRIz%e{hS#s$9xxY`#b+AZ0XP1bpsqpFh{m!huTCA&}0RD58yI9r`~WcA~e-1 zYv8fPSQiTlQ9+SX06!&1t(Uht-d6Z44V`K0of;x5Dl0DJMjaLHC&*?NXe;JUMjb~f z?5OZ8)EGWJvMGC4GWeJ4+T%Gqno*2(1yK8AIuACl53B&nmZ>P(rcWOG&$rlJM`|%T z;z~;^B&j9U(so%2=d2uvEP7EC?n7U-UIU55S7|J+Nr4F%S+6YKz$UR!$y z^Q^KiLY0}MYq5D_(76$dDN8Ou{h`)>pwsaze;$svb7SsD1iD&cY)nAZrQ@tQ_8Nh0 ziUj6Kx(>tSJ>v+H4Ai_^_yN{rh)tkqv@t zQ7G2Ih{BvHz+~L3=CzHrKStFG1?GMlREuvJh;KZXlS&~bP}SIVqqW+bFyavnen&=b z{M{W7t^holX2R5Hxhqg3S|#lIXPaZDA< zt-?muL2@&6Bj}qN*57+78*+;;hsBfBA&EL9^1Ewp7&@ZI4y+xTbKaHLFNNFYSW9f= z;VL+cO;FKJ+iYhYh)Cx3elq3yJv-i>0}!jRrvQg?E(-4UwCaLY3L(x_siGe*|1+yc z!wQ->OQwC57Vd3}l3+K77T<5RUb6bO3e!vlcRBm)^6oPL@USj`^5260X7x2MxbAdN zSS09^DjqCAqM2e*AtSFjbMC`mVp?$W|Dgmcji-@rlj+wU1KQdgWX2oXI3Z!VTeK$d zxSIe?_MGnbT(=88a?8_K87PI&h0I!~T99zShdKaCoPmT=lVN`@^_MOlJf`HwzI zKk~kz(85ZCuNK8fgk0wEM5UKnZ1?3%oc%njKx-i*lBcw^Tk|6w|62e6Ztz6~NCZ=g;ThWFCa_iz5XV zdHfNiE6ufi0W0AxdSwYr`0_X#tiXt@mLQG8!zCy`JiZXKSEbTEqThu)1nCjTp&JW# zIg?91j`0_tf-ipjalY`>HJ-ZBc%s4MBAk%qp^Y`&lqto1@~7(dvdw60#A@S$XDhMP zSW@pS;r{eIQDLN}@2K+}!i%rK@BZnYyGz5h3YBy-Cmr$5QOl|E3~zl@oIEKFR1@)DsU+~d(mtS~t$KQDNQGWHA z9iMxo@t7#hqXv7a`x!{}Y0sxDdTptgVs+`5a0o@$hw?g}GtU5tkN8OZTn=x*3y-2DjM|BsU2$ z7kZ0DrS7Q3TJ|n{AWcDsYbvR+n&ayle!3)^%@?qiyXa=2!)B;Qbrcn8^+BbqV_NoP z7*@pJiRe1X1@O5{ouCZYz-xEJI=vAQ*)FuzxNZkNf7bc+Po42MKXt~>J}P`fIw#f# zT#l;d@)hIWB3FTzZ`_xJ`x~2EEAjsB=7z^m3Wa&Em~s!7$>aH-zkQeQzI+?=>$I*! ztNKl`leOHn_yknhJo-Db=7XJ?Pxq4=FL+mM#`}UJy$5ZEJwm^Z(&t6@YLSuvLTX0>Ml66j})m zbM!384-)oAYi{L`iEY*C^=k&{JYlg(P;%ph9L^-%Z1-gg@mEHTy-lGk-@g?YSGcYR ze)jsF|LXHM`OkjlIv-u&ra3!r>5ErNF)eT5Xx~`zq=81jvhx1r5ykr+`JuXbjURSY z;&~H=7mHNnp}}hxo#)={9Quyt8a)>z2_^{(MGxUeW@lLy7|l#-KHee#HXDT`I{OKa z1-z5ve!;-8>`JMN%_w!nju^$(Y3sK}P6w)!p?#|oFwaPL3yJ;>qc4U8>$LWLKtOzl za)D;RF_@wskOBy4CE9(NC+RVA=kDN^c~Q^4fce6b8m&@ap+8B%s@l5jjmGq=hEOF` zo<$lZ=rQb_YMos{8p||bKC5?j{gPjK)cDF@e3UOebHXQ^r#8*tOvVw4S@=Uy^9KHx ze_y8!9>QA){In07F+KYIxFlsM4#4e$^X94?${*4VY_83}sMO=PjP= zoutS9oE$&wT{lr11X#VZ`WjgPs|~sm0g(B6-MFV4R64KH2d%fep|VVNsl;9mrb3rk z%ZsMVsS=yoh|?_4M~}UNKcH$r_w$16v4^>2FwV0-8c44IUs|CaOMXpXU9!=~a3@M) z5^_hOp3F3ilhsoR?rlR5LU7hhv&d}937`iSKzgI~J->Li=fC_5kMZw+;)GA&oY*YD zsV=((xfzOQ`|`&Yy58Zw#|RFPgq@8-$tay?jL&g*PRR&K!F;MV@Y!4JV#ZY$vf zM9jdFIp!TKR#67HiiEPYM(^x+ulN9ON6mfL*8{fl^8c9h}M)C`DX!5QuqBx>z7LTO%!uR_z>}6D+qTH#Y?R0QUu`1icV3 zy+cpS9aeb}r&}jlfL7qcSzNN^rs31hCybqo)Ge|Jk}0kbkb?XSR$Y0}LBNS$+6F?A zLcOr(ndO52;%CnI^-rGg48}Ftx(aWzgyc$q;)e)PDUtfOXY61O-u(T2$8~$!I9=Fx z=e6@Yc=9Zaj){&@5HdX)J6U9Dv<>j|R*zgc@we@h_hWJ#3IF?a%t%O5cl899!+>UM zJwWak;FgHDvOBqEWz(Ww()vfau}4tZix*;9;T?SfqTD`v26(t1orcr0%l5+^5BdFq zG(loegr!FgT3G^_s%K%4(`1Fg)2r;bZZ!C$`4;&qG-e2|`h?1Jxo5Q$Q`7qP*+iiU zqC1+yquk|JKXsG8`MDcByX#y_Y#|#z?4DN)=Wp}#u@S%j$fVOZt|v!=mAs_w5N?Jv zx1Aax?D;!W=U~F+9YK7Dh_WUrL zhrDJXo!s$HM&LEj(<*{XG>t_oo)kzkh-H&=F^YMLcooj*aCf8BH{t=RGErFt3<`cq zw$@4GBT4L998}svRc=09TX3t!22r`R6J-&&^y+2S!)oWC^-as~@KY=VCz9l8; z9#mMEW8VAt=O3~l(=(|;psU9bJiqdL6Jd4daJV)eS2P!C_CS~&iDB%)SRAYoO!4DO z`+V-{kiPTdy@vKbs^jgH##{{<-0N8%k~w-2FZOn}15YcTO+(_dxWZ5Z(h-5~jVf_- z^QrWU9h(R-dJg6^dRBvmtqb?tKA;$Y3g?jDhI36wys8tb_ z8ZcQ+RlZnJ`0~|fVMH`iJdhPrmaYKXI)Gz~8W5Vf>#xuIij&oYsV12gc`;`(L+O0v zwDFgpKIKy<9W@L1G!)1ch@ZDW@>&D(9}l*?&EQX@aCG_c-GLZ#0bRK`SG9oR>>OlS zqu^%@T2zl2#Rzny<>n%?WSpg7)DQPx9&SnfWFO_9`xv9B+Zda35aB-ch~Q^nAbj$& zH}0n+tdx2u0jFaY^XW`?K*h3hG_-B;J0A3SxGX^DJo1_O20?s= z-l7;r9ktjOAofEq!OljU37J%~EH=w+qZ?`{jIeq>BKu`Ny_R&YR`tzpJuA5zA2?es`OFiIMeEA+Lj4YdU_W}FS7-{4pPq11F%%mW z7C{fS!UGQ8cqm9G+xs28@7v7XNYP=eBD{LJ z^6Hy=RwD0YJ!)R83*L3m)T_W}^@xX+eR0c%pHBAnuiA`M;s985q4L;lGc;oqVb?aK=yWkEtc= z-|>cYMJ>v7YtkH}(b>tKN3RJ_TvtwTmU_eyox9Jq>;EG6hr(Oy|07faig5}&aZS0o zYiM^C?=%f%xa-iesLDh+_zAC`FFgPHf!iL0l6gEhbbOfON3A4|?!9rkt}3{z%0UPh z(%d;9ymY?ugID)lSOit2w;<#Y%d^(47oURcawUG$2U5KX)PR9#!u~QOe!IZU|pkm8xSV~dnMeP{ItkMIE!Xm&?tRu33w#Z zL3*@j&h&|rReQrPb{^R^Ztn8CqutmxG+{XgIUF&d`kuQfX5MvdWdu0&Hdn=E0mbN`qJ@3 z9Pu=mH1#gZCGgxEE4R)U*7XGZB>65ucGJyu#We$l(JQcR_y98{s7c$Nil^#JYoi?9 z&Q&Ua*cU{G?2S$@4|qJ30tk-14>*GpqzElAlfJsl4Li!~371A$Tt{Tz(FN=U)j$5o z!e<}7dk<2PWS5~0*(>DekURdy z+?zPAHkgEp(|QERM&*m>GY>i*4~GEU!K0D2lSH2$-B6=66&#&gfIFrEN+mfPOgdH1CZqVH zJ%+aN@$Vyn$;W*9bjM%*=uIAxJw2O6DkL)`H%oO`9S)*=`_+Zt{q`jD3Hsi5c!I<_CK3(I22v%NCJ)vs$+~HZ}GV8;W{Wx};6Z zs*f;TX%K7o;of88T}$`5-0%lI9u5Hrh)fHSEH>i|YGq~xfP=%_Od%|n zY*K~+r6gP8l<7{5>!F0ioz}xA6W44@-e|rHDHYB-cXL0F?Qz7- z7hy5y5ivgT_)VVj9dgKYpmwa4G#RksI8ArlKHu@xKfcAc-{`!dGCB>7>s}S``yBUt zenrr(GMBG@_efFHoNprF@qSYQU(qEw81D|VOl$wvz+(Gs#Q|`4R&n;tdF}xJ?Avef z;w_`=4y0!lU0lR zEWLA(0~fn}EDRBv=or%`u)ijJb|iujJbH{L+`XWzZUKmYn0-0mk>JIP)VnMRhC zu-UP(YZbx8hB?P&-U30}u2?}pw&B;0;`dYrwy7adiFyHYjW$!%S{TjRedqy>hjalX z_ULoTJ?ec5R*tvip69WZwlTI!V)pK-{JxZm1js!8c+43@U^rMAL0u6JqNA+R-B`7Q z9%!;>XDhqjkq%m29qam=>y9<@K|ud{297|^Tbv{;4xc+a;TJyh1UHsFU85tjdA6H& zL4BdI&=C&Hj+b5eM}Pb}zx$`RdCkKI&8{n(vCgr5n}N8;a&uJ$yxj}d7nMq9-6PqQ z3zUC3k@EEUY{Lj1J=?uc{%)q#fV~K}MES#4SN@kje1-46(YW-Rn4hvri#_>#p?gbu zdlc)qDCV`9N5%6eqAhp8Iz;V;vbv90RWSg&XPhj9d;x$nv*1RvtO=-K*8?68rvSQ~ z$BPp?|C%K;Et?pcqn!*`lrLspEa3qp zuLGx9Y$LbykQeb4XT_ylkq0{-G7G?2G)Ev{cUAW#oTIFIu9}vnO~hzgmfuDVksge)w&Tv}qx|8k%Kz|tukkNmyx=tz_FBy=*^GT2 ze(&O{-wpA-8U);)J6wUp2&M3|gf22k_Cp4BgGS`)wdcRbCN%Hz5YpWu48w}kS@@F+ z;eYz$SNKQYxy|c#18X}_LB!Ii879$>M{=+`GIZK>H^bkTTTK;}TWJOfVmw2G#;i>`Q9QTpi3_uhAlI#&!09~#?H^_QK}0czX5;sQ#bg-A6)YF%UyJkMOa&mnRcOhi|wUxba5_i z$3OeC*Pvf==ZhcbuROi*Q8jjBAu{4Ep}!|0xte#suM$X~_$YaC1=hvSS1rF#^LgJP zEP))&gmYE??5^=Y{QeL4AHVhrFZd&Hasz1Ts{^7F zqUYL2glhIg^8Q0F=um(Ueh66~Whg4x27ODv}5t?)!h6wb~ zEy0@AcG&5|h($9H6ujqdKsx40Y1vCTUr08yIh^0Ejfpsd>+Bj-z96Y++}GgtkKXH9 zqwNX%*T&w3)g^b&4HlNlmJH-`!9UEP{D_WHlaILb*Pp%4AAI_fKl}QDi@sxj5|x&_ zY#55i!f!6Di*d2L#zlXWfB4P%vH^r*k5@q}$e zbt{!~7Uws9xOw(*c78uMJiXs}Z&!i&Lk|no7p&+=2X}4UQQ=inzVTY;fBd~4@c;hf z*Lj{Z)^?MH5Vm@oHG{Ja8*vm*@|uwqg3{*59MzOu85JLbk!YYA%*Ki|UvtOk7C}a{ zq!Y)UkXbGK0V#m87U{377;YW&HPRIsqIC;yzYOG;V8@L%#F6yJ%jffCPvl|syJ>L( zWkgO?SrJZBhoqkT55Q>9=7;AEh5f|2}rh8DG-$S7E*V`c(Py7arl;ufEDZd*LqDZ$L9v_o#YAF&7RvX1gdHQss7ofA!pLUcUGNfB4!X z{MzR}!e4q~$J2{&N-VV4^eo0K=oeYdR^{GV-{QVeq2g3zy3$_x^h~R-v&%9BA*L2T zg#)&mUO3eH$dg8J5SV*J++WdDbz}5>vZU)+LU^SyPLFwsI z>EL-p&zuL30X%e1z<}OUfCKUb!6Z5cDYY0PH4;VA@r}-*>YX8ArWZx^Dr_95jKedG zAB{jF@fWR|(g|?ISUG6A5t15PmfPd~lmJ1@V&_Ys<3=Mtfdu=ALsPVUa6kv^5>jJtNqH($TQ4}Sj* zzV?Gle)W@Q{JWnz<1Oaj5n^ks zEpqVD-6-^b;vAWMAEU}KRbwfZEFG`wgaB@>?)*(UmpH<0obSB8^1prWF8|`&ukmmG z^i7`I3wKT)LwDDRU3r4D5}UwA06VtoQp7Ew`gq@oPs9b+K$%5A+8*MXo8V3aTD*UV zK9-AS4+398j#7E)pcj)-3qF{RK=IrWy$l{iF`{!Rc+@Sc#|}F^ho|ZW@UY6lreT8k zksozG$*Tnx0v{7W3BNGlm{$pn;anT;b zZrq6eku+RwxC#UBW^O)e^fP9nveD4n_)?jVbT^MD7(5%bO1`hmszBA~je$e~m^z52 zTcHLjxGGCX!3VT4$Y47uQakB*^8Y>ZnX5-lzGuKgvT=u%zn;X8DQG!`c0bATAp}mr zpZr+J>k8f?s;nMC!>-P{c*c*a<4gWK7sY)8(0R?6{~w_XFc#|8ddU{7%+pfg?acY? z4dwsv%TIIr)+PV!d$+iIddi_iFL^w63aWkzv8;ks2ufdebi2VT>w#OhZu7@qzs2=$ zy}{!r3r{|BgU8MmZrQ0bsOk@hmyg8K)C0BS`RBy6~4$6rfQgIB~i&Mn2za|a={44@3&yNuLaZJto+ zk@7N2h%M8ON)Rlhwo>XIi;mbC*MUR%PuPT^8-)TKLGJm6DR^%+0>g)Wz#*&)Z=t_W z3wZSFdqV=_BPA^2FFmpFUw-jf-q^py>#yDBAlK76St`ufP%yJG6~%O6)rE7r zi|h|Pe`gP`-UjLHGL>s0SX=VGo#q{3N2iTwcG5pEjd>B$cka2%Q!3PO3zvYzLt0`@ z_=w4L+z&Ln1N}DNdTwR;8>jsBkM4LhTW|#p-R`A0C)TLB5)6|FblyBse(7_c;8Wi< zzHzrfYb3utS$M@M+1R5}pfZE{r4Uczi)0r^0pwnm| zS;?KUglMP}8Ozx9BDS>_o(43mFkP406I z2NsN{R`@H=UgM2ld4f0p<;(o*TZVBHT4%3hPPxV}EKX15phT-{v4*r8uyi;v^bjEU z(!w|G5{p_#iCfehxN2kzEaxMcZxQB=IM9;wJBUKHZTtwJ)mGZkPa@jBchDWk3Bq-L z_nQZF{}St8dzydm<2xQBnrOsWL>%g^#@anOkcv5)YJpSa6+|KtMWK=&o+ z{c3|TsAsVqp_|^A%t>>lcL_C+}UZ`cKvTV>S;R3K5u=uOV}jP_J@gFBgp3crm{e z1HFk-3lU`&>#@5pSz}$^hSs2OVfOUB-zG9Jzw?j^;(p)1?`JS2eSD}ClTp%{Tm(Mi z@V7p51}G=L_X>ab#w~95g@x;pe^$vgn>i7WhL)Oh6ycW!5(3CBePGv|=47&YZt*TX z914-FgIR#0B&SIbL%dIzt{sszA$~)Aq3kstAl;-IoJJmk#jxc%FCUD5^xZqGyBD~- zJjLJm#3@f{xR)nB=r@^bPt52Qtc;y^aHW~@sZ-@Y{Mje?`Wrvs>#rTS)SH;a#v9Nv zIbf+mWq&}&aj56W-cEs1azXhEfvZW**hK0-o^tecr5FluR<Tf|+64#kp% zV3`9#r6r6lf|zhXb8}41BwxUDD;|KCA__XJwa%)}tuFk3|Lk>Mu{|&T(nt9ZK68W5 zUQ>1+8^uJ={)(!{8ZFExW^{?QdR>jb`pgaf^`}mF{?-Mrt(P3QmhTlS&$ZHiQdPVW zXHv=9l4J8V5LSVKG&;rI0GYr?BAp!yK{7}ku`826HdQkKk=0Szak4gaRaidAy#a-D zvP>}=eufX*j3g^$%-4gJ7JdFAa3e`?G%u~MBdu2!zY>fNBUnc+I+55i$tesHyy;V$(*>e^P5*ja7EMx!&MkeeZ(Xx1Qs* zH=p1?|AnXc+)d>XTciD!FVUtu|10jTxW@BqXEAtsxA5=(g{S%2D{t_>eeZ(q*RZxv z)KWY3hSjckmb(xgK?+jVk_vahy;^{!^*2W4sV4%99h#wtCz4aD&C|VY^wlv{yv3UC z=5%YU2z!OD^ZpNVJmmJ^ekNIrpt&nerA+dKkhSvP^LItyB||nv^;K6oD}g0uzq&{d zrC;Tp+COk=1s%S!4=@|PqiKf)+AeqkZ{_-z>-Khe|NDLK{XE_}9cUrxSCl~6R+UgaPE$t7QZ^Mcp=DIUc{!Y3Dc1JuJIaK-f|tS5Zyjl2AV zfB6b8y?McZ{wp8j7d~>r)81*_XtannsmF8MtUU=sVqEXeuRM8^U;l#gtyf;>PtVu! zPIzqaQOitI;VV&R(xp?xtgT0Cg-Gk2%H0%+4Q(SZMsN*6xu(iPz>UeJE=O2ZHkY-7WV!mY_lvuu_~b@a`FQ)`8ij*dY$N@X$NK#Hu3 zrG|};L4z7Bjf3veQh7vEhb_7HcnkgTz8w#?>u&n|QW=)bQ5J;=oI?1?^WDpp*ZV@(lk_J;`pnY`ODbw_xlv`rRzml-=#8HcNIZ72>E?*6 z(dR*(9$huVr;Udh))1C~#ESpFO?^so94ep~dM`*hqS={OPB`d}KfAok|NZx0=Xk;Yo4+gHK)O4}WlnTi-nA+^*4E3zx@} ztv6yvI*c00eX-=82;sK2jTWoAmf=QFnV$Hr3!xO0F$xI<+VVq^_NJa{w@ zdb|fg!0h}d;nxT3*G*tg(l3mSKfG5-WGelQ3H40;y2w}%BM(NLThv>8&BsA|TkqZR=tg>}nGuWgI9%2$HP7AbnXz|Dy?O z1gw;vR=otI6nkJqqt?JI7;=e9Pfb5FT+T?H8PH^bUFWs+asKJ|F8JP?-{TKHbDh8S zbC2`$&)(n@yT+LtOQxnragz&b4Z~SX`0T0km0x&_m)?AhfBM1&cR8hHWu6k1t3Bsn z&O->Sx-x@~KFgEMaMh8;l3Ig8ASI6)4Tnr+r_%0$gQJE`L*O0MI-1C4PV)yu1vcj_ zh!DZX)6C&_73i8^Jgl>K#kvqpE8_cFdjk0M(=wtkbYNKfh<1n2XJL^hkwU=JfAx$U zE|7fbtk}Z1^dKcU79EV_UQwDl*OT1wFr)L%j(6LUcPr-ckEIy2|`0; zNe|4Dwwh^0Vyq)Gv?07$286L=Et^|q4?akJzY_2g5I8zM2Q9WXr47kC#dpG8alZcA zp6|c;3cvT_3w-fsKEkhk;p6;r-_a=Aau(f^SL_TJ&~md`cv%(97(Y<^8DHXJp0gwD?` z!lyreonL$QI3&B?IsbC2gunsa`qj>ryF%qOc)RTDj)AZ>@=*mHY5<&R!E z=ew`I$?yNkfnWLbb$;oSH~Hmf&iK@|#^X!px@Q>Don}EII#uUOpV@J4kMn=|-Iw|H z8@ITSo2)F!UM=e_n|F%wK3-B~&|t!W`c5d0!7|m#Sj2lp%ezePA{m=Ycl;TX7o*y=cM-0vc zK6%6W*-u~RuYLSFukW3gFP&HK7%$!KyneT{KODf6%eF&z3%6GI7vDYSk6*oH@27|? z5z=#sPE9$#Ne?NLH^gQlnaT5vxtd8|Wg~2*xJ!t#-Iip_Y0oq?2&xUyQ|Kq$>38_I z&)?>oFTKV;`NnmA=@U=z#b+Pk^G^yNd+d}aukCnzQI>@YNAd*D-}>ws-G%?|U!U_w zuQ;ZM*n7f)<>woP>l?RHDw7FF zgGd8r_2!xTv@rob z+=wog8#P9?V6);7L+0AM@Q+-4I&z!OZcRcF!Yqp)2;E*8w-Eo z2CPrO1≻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 UD1!Vqp8x;=07*qoM6N<$f;4^>@Bjb+ literal 0 HcmV?d00001 diff --git a/resources/icons/16x16.png b/resources/icons/16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..daf7e398bbfb5a8a4a35f5a8d782d4c0c3ac8cef GIT binary patch literal 1126 zcmYLHc~n$&7=5VBykU_65d|%hG({X{5ZOvA3<46!z$`NfTGXP%OfZ8{KxG?*VQpe@ zL0mwVKpH?n92>|{P&NSt5&?lZ!9ih|_xpZtmL8tY>7M)D``z>X`Q7C0fj*{2Hbw+N znELs81u@Q@A95k1>v(3t1hF7{yZ;Vvy}mPcl8RPRdi`|RFzgz_p;9WSQmxgY-Sz5_ z+F7jAU3j4uDj{+LM@`@(6Lgf4j#M%`2$fXPbM?`2osM^Y3B)T`U}i_#rH4!H#k|`fq%45If0$e-jHI zTZ zpacb+Qb3XdC*HwKOj4i}1tj04iu)+5Hkzf-vhHY?wrbeT8kSsZ*sNtWYYmx2&O{Ac zt|1xT(vVFWQyFb>8=K$8tD14lAkG=3b4Iav7<;y1@+M8z)5i6*Wdj&rr^z}T)(*5* ztJiC*#xb`JlhxRy1`C?NLk12FRKx>Ht7FbOy}Hb6DbuV_;Bf3vgoR@ z-QY8x{m4Hq_M?-o4$mgt)-!HDGU@uCyV;LUxvhROF5r|(%^Yf`RC6koYO0pcb@%bz z=Ii6*=V8uO9^Xe01}pr$Ja;VbGT<6a>zHU_y4Z}%HMdy2#B%9^g~TGOWy`H?Y*yH; zv|jnjtG0&3YpeF|W3d0_d~5eQv3kvS;o;x^a3JE~j|U?Ty|I>9XaCdT$fzSfAN?gd zMtE$!1F?a3JT@-=#K}_$2?>cwj(kGkl$;_;J)M>=7H4E;ZFD9!xn$?${wnz`FC#yr zpwQKgaQ8TKHZSAc`JxNO7cX6Y^DScYmMbNt;{2;+gN2M6!?c<0VfKHc>hn;<#6Ki{(_bH2z-&rF&lh literal 0 HcmV?d00001 diff --git a/resources/icons/24x24.png b/resources/icons/24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..634c9ddbcbd7862799a44976cf978ceec5184db5 GIT binary patch literal 1231 zcmV;=1Tg!FP)!npz~WjiG6i(v&o6TSSW@f(}H44vGUo5kU(bbRas=K?g-} z77^4=1O+FegNh(@pw)p7AzEUrZA_E4G>x`t^4{xBbI(0{ug}3b_r64(x?!^id$Im} z>-*M%|ML;Rg}TlD=O+B%*zEQfTYYM?=$?v300|6IZ!3eb43>;Z*jN%#_B1|o=c<15 z_};_kUz(rg@OXq?n9q3pHS_U_KJw?OzISG(I>1P)+ zm*?s3&6ZRPP=o?>og>wq*Tpy9YN8m5d%FVf%wfCJJ%6}&Ow(?Q?pB&8ea7+*FikQE z@Bl$JJg`|RNX6a3deF@$L~%o$UC@ z-%UpRW6S*M%?_tTc18tM)DI}8G$>(*U4;v{iVIsoTg@noWGzXvlHvB76Hy?ghNOgm z3$uNoY3^;Xow6s62Cqhd~Dy0&mUQ3<3h*l(?CO%=l@lB?p1Nyihv*q zN=;CQ#%n;K_7rRADnw!dkweUtcw<`l?#4BK_?O`AS%N{l;Y=E3a^8Wlxc?MD>IY!o zpb(d2Qtlv4>Wx6+wHmUd?9}`!Y5w5#KG-rBJ5>) zJE|B~#K0rUS2!?UcUa=(Untwd~4p@o!*>s@4EH$U-Qv3m-WciR`(+& z!%|eQ1*IgigJRjK@2Z7T0#&@Vw(8Rd*3!?vdTiy?sms;J_BJ=R$o=pacm!^SDJj6! tO2r5iD``P=6T?(!#JnfEETyH-e*<;{ns$SC)^Pv;002ovPDHLkV1lV-XpjH^ literal 0 HcmV?d00001 diff --git a/resources/icons/256x256.png b/resources/icons/256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..1b069046751e32928e9cc13b2fbbdaeb13c7e9e0 GIT binary patch literal 64209 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�axY0d|3<(+H38Y@$+^5PN2n3 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�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 LNkvXXu0mjfcblg6 literal 0 HcmV?d00001 diff --git a/resources/icons/48x48.png b/resources/icons/48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..376ad5b5419b5ac9c540eb338b2bdf6fab587f2f GIT binary patch literal 3527 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 B-HZSL literal 0 HcmV?d00001 diff --git a/resources/icons/512x512.png b/resources/icons/512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..4e001107ecf8be83dc1b6cb09b1e879fa355c114 GIT binary patch literal 168450 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%0Do62jFJOxXuf1myFwmaa;&Xp0Mx) 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 U1LsB&@-+Z(rnosib~u{!Z$0uHjQ{`u literal 0 HcmV?d00001 diff --git a/resources/icons/64x64.png b/resources/icons/64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..4628da40c3914f62fcf18a0d6b670f826b3cf499 GIT binary patch literal 5779 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 resources/icons/x.png +// +// 为什么需要多尺寸: electron-builder 的 Linux 打包会把图标装进 +// /usr/share/icons/hicolor/x/apps/.png。 +// 如果 linux.icon 指向"单张 PNG", app-builder 解析不出尺寸 (返回 size=0), +// 图标就被装到 hicolor/0x0/ 这种非法目录里, 桌面环境根本找不到 -> 安装后没图标。 +// 指向一个"目录 + x.png 命名"才能被正确识别。 +// +// 用法: +// node scripts/make-icon.js # 用 resources/icon.png 作为基准图 +// node scripts/make-icon.js <源图路径> # 用指定图片重新生成基准图 + 全套尺寸 +// +// 依赖: ImageMagick 的 convert (生成结果已提交, 平时不需要跑这个脚本) +const { execFileSync } = require('node:child_process') +const fs = require('node:fs') const path = require('node:path') -const SRC = path.resolve(__dirname, '..', 'resources', 'logo-candidate_004.jpg') +const RES = path.resolve(__dirname, '..', 'resources') +const OUT_DIR = path.join(RES, 'icons') +const BASE = path.join(RES, 'icon.png') +// hicolor 标准尺寸: 覆盖所有实际显示场景, 全部从 512 基准图缩小而来 (清晰不糊) +const SIZES = [16, 24, 32, 48, 64, 128, 256, 512] -async function main() { - const out1024 = path.resolve(__dirname, '..', 'resources', 'icon.png') - const out256 = path.resolve(__dirname, '..', 'resources', 'icon-256.png') - - // 缩放到 1024x1024, JPEG 白色背景保持 (Windows 图标习惯) - await sharp(SRC) - .resize(1024, 1024, { fit: 'cover', position: 'center' }) - .png({ quality: 95 }) - .toFile(out1024) - - await sharp(SRC) - .resize(256, 256, { fit: 'cover', position: 'center' }) - .png() - .toFile(out256) - - console.log('Generated:', out1024, out256) +function haveConvert() { + try { + execFileSync('convert', ['-version'], { stdio: 'ignore' }) + return true + } catch { + return false + } } -main().catch(e => { console.error(e); process.exit(1) }) +function convert(args) { + execFileSync('convert', args, { stdio: 'inherit' }) +} + +function main() { + if (!haveConvert()) { + console.error('需要 ImageMagick 的 convert 命令。') + console.error('Debian/Ubuntu: sudo apt install imagemagick') + process.exit(1) + } + + const src = process.argv[2] + if (src) { + // 指定了源图: 先把基准图做成 512x512 (最高精度, 往下缩都清晰) + if (!fs.existsSync(src)) { + console.error('源图不存在:', src) + process.exit(1) + } + convert([src, '-resize', '512x512', '-background', 'none', '-gravity', 'center', '-extent', '512x512', BASE]) + console.log('基准图已更新:', BASE) + } + + if (!fs.existsSync(BASE)) { + console.error('基准图不存在:', BASE) + process.exit(1) + } + + fs.mkdirSync(OUT_DIR, { recursive: true }) + + for (const s of SIZES) { + const out = path.join(OUT_DIR, `${s}x${s}.png`) + // <= 基准尺寸的直接从基准图降采样 (只重采样一次, 小图标才清晰); + // 超过基准尺寸的才放大, 放到最后单独处理 + if (s <= 256) { + convert([BASE, '-resize', `${s}x${s}`, '-strip', out]) + } else { + convert([BASE, '-resize', '512x512', '-background', 'none', '-gravity', 'center', '-extent', '512x512', out]) + } + console.log('生成', path.relative(process.cwd(), out)) + } + + console.log('\n完成。打包时用 linux.icon = "resources/icons" 指向这个目录。') +} + +main() diff --git a/scripts/selftest/electron-stub.cjs b/scripts/selftest/electron-stub.cjs new file mode 100644 index 0000000..2415942 --- /dev/null +++ b/scripts/selftest/electron-stub.cjs @@ -0,0 +1,48 @@ +// 无头测试用的 electron 桩: 只提供 src/main 里真正用到的 API +// (app.getPath / app.getVersion / BrowserWindow / ipcMain / shell ...) +const os = require('node:os') +const path = require('node:path') +const fs = require('node:fs') + +const root = process.env.LNM_SELFTEST_HOME || path.join(os.tmpdir(), 'lnm-selftest') +fs.mkdirSync(root, { recursive: true }) + +function ensure(p) { + fs.mkdirSync(p, { recursive: true }) + return p +} + +module.exports = { + app: { + isPackaged: false, + getPath(name) { + if (name === 'userData') return ensure(path.join(root, 'userData')) + if (name === 'documents') return ensure(path.join(root, 'documents')) + if (name === 'downloads') return ensure(path.join(root, 'downloads')) + if (name === 'home') return os.homedir() + return ensure(path.join(root, name)) + }, + getVersion: () => '0.1.0', + getName: () => 'local-net-msg', + getAppPath: () => process.cwd(), + on: () => {}, + once: () => {}, + whenReady: async () => {}, + quit: () => {}, + }, + BrowserWindow: class BrowserWindow { + static getAllWindows() { return [] } + static getFocusedWindow() { return null } + isMinimized() { return false } + restore() {} + show() {} + focus() {} + webContents = { send: () => {} } + }, + // 注意: 故意不提供 ipcRenderer —— electron-store 见到它会以为是渲染进程 + ipcMain: { on: () => {}, once: () => {}, handle: () => {}, removeHandler: () => {} }, + contextBridge: { exposeInMainWorld: () => {} }, + dialog: { showErrorBox: () => {}, showOpenDialog: async () => ({ canceled: true, filePaths: [] }) }, + shell: { openPath: async () => '', showItemInFolder: () => {} }, + Notification: class { static isSupported() { return false } constructor() {} show() {} }, +} diff --git a/scripts/selftest/main.ts b/scripts/selftest/main.ts new file mode 100644 index 0000000..1b225b8 --- /dev/null +++ b/scripts/selftest/main.ts @@ -0,0 +1,676 @@ +// LocalNetMsg 远程功能自测 (terminal / forward / usb) +// 在一个进程里跑两个虚拟节点 (A = 控制端, B = 被控端), 走真实的 +// ChatServer + ChatClient + 三个 remote manager, 接线方式与 src/main/ipc.ts 完全一致. +// +// 用法: +// npm run selftest # 全部 +// npm run selftest -- terminal # 只跑某些用例 +import { spawn, ChildProcess } from 'node:child_process' +import { existsSync, mkdirSync, rmSync, openSync, closeSync, readSync, writeSync, writeFileSync, readFileSync } from 'node:fs' +import * as fs from 'node:fs' +import { join, dirname } from 'node:path' +import { tmpdir } from 'node:os' +import { connect } from 'node:net' +import { createServer, Server } from 'node:http' +import { createHash } from 'node:crypto' + +import { ChatServer } from '../../src/main/chat-server' +import { ChatClient } from '../../src/main/chat-client' +import { FileServer } from '../../src/main/file-server' +import { listDrive, downloadDriveFile, collectDriveFiles } from '../../src/main/drive' +import { computeWsState } from '../../src/main/ws-state' +import { TerminalManager } from '../../src/main/remote/terminal' +import { ForwardManager } from '../../src/main/remote/forward' +import { UsbBridgeManager, toUsbControlSetup } from '../../src/main/remote/usb' +import { updateSettings } from '../../src/main/settings' +import { listAudit } from '../../src/main/db' +import type { DeviceInfo, WsFrame, TerminalFrame, ForwardFrame, UsbFrame } from '../../src/main/protocol' + +// ============ 小型测试框架 ============ +interface CaseResult { name: string; ok: boolean; detail: string; ms: number } +const results: CaseResult[] = [] +let current = '' + +function assert(cond: any, msg: string) { + if (!cond) throw new Error(msg) +} +function sleep(ms: number) { return new Promise(r => setTimeout(r, ms)) } + +async function runCase(name: string, fn: () => Promise) { + current = name + const t0 = Date.now() + try { + await fn() + results.push({ name, ok: true, detail: '', ms: Date.now() - t0 }) + console.log(` \x1b[32mPASS\x1b[0m ${name} (${Date.now() - t0}ms)`) + } catch (e: any) { + const detail = String(e?.message || e) + results.push({ name, ok: false, detail, ms: Date.now() - t0 }) + console.log(` \x1b[31mFAIL\x1b[0m ${name} (${Date.now() - t0}ms): ${detail}`) + } +} + +// ============ 虚拟节点 ============ +interface UiEvent { kind: string; sessionId?: string; peerId?: string; data?: string; text?: string; reason?: string } + +class Node { + info: DeviceInfo + server: ChatServer + client: ChatClient + fileServer: FileServer + terminal: TerminalManager + forward: ForwardManager + usb: UsbBridgeManager + events: UiEvent[] = [] + driveDir = '' + driveToken = '' + + constructor(id: string, name: string) { + this.info = { + deviceId: id, name, hostname: name, platform: 'linux', version: 1, + appVersion: '0.1.0', address: '127.0.0.1', chatPort: 0, filePort: 0, ts: Date.now(), + } + this.server = new ChatServer(0) + this.client = new ChatClient(this.info) + this.fileServer = new FileServer(0, join(tmpdir(), `lnm-selftest-dl-${id.slice(-4)}`), { + getDriveRoot: () => this.driveDir, + getDriveToken: () => this.driveToken, + isDriveEnabled: () => true, + }) + this.terminal = new TerminalManager(this.client, id) + this.forward = new ForwardManager(this.client) + this.usb = new UsbBridgeManager(this.client) + } + + async start() { + const port = await this.server.start() + this.info.chatPort = port + const filePort = await this.fileServer.start() + this.info.filePort = filePort + // 网盘目录: 放几个测试文件 + this.driveDir = join(tmpdir(), `lnm-selftest-drive-${this.info.deviceId.slice(-4)}`) + rmSync(this.driveDir, { recursive: true, force: true }) + mkdirSync(join(this.driveDir, 'sub', 'deep'), { recursive: true }) + writeFileSync(join(this.driveDir, 'hello.txt'), 'HELLO-FROM-DRIVE') + writeFileSync(join(this.driveDir, 'sub', 'nested.txt'), 'NESTED-FROM-DRIVE') + writeFileSync(join(this.driveDir, 'sub', 'deep', 'deeper.txt'), 'DEEPER-FROM-DRIVE') + this.driveToken = `tok-${this.info.deviceId.slice(-4)}` + this.info.driveToken = this.driveToken + + // ---- 与 src/main/ipc.ts 完全一致的帧路由 ---- + const TRACE = !!process.env.LNM_TRACE + const route = (peer: DeviceInfo, frame: WsFrame) => { + if (TRACE) { + const p: any = (frame as any).payload + console.log(`[trace ${this.info.name}] <- ${frame.type}${p ? `/${p.type}` : ''} ${p?.dir || ''} ${p?.sessionId?.slice(0, 8) || ''} ${p?.data ? `(${Buffer.from(p.data, 'base64').length}B)` : ''}`) + } + if (frame.type === 'terminal') { + this.terminal.handleIncoming(peer, frame.payload as TerminalFrame) + .catch((e) => console.warn(`[${this.info.name}] terminal handle error:`, e?.message)) + } else if (frame.type === 'forward') { + this.forward.handleIncoming(peer, frame.payload as ForwardFrame) + } else if (frame.type === 'usb') { + this.usb.handleIncoming(peer, frame.payload as UsbFrame) + } + } + this.server.on('frame', route) + this.client.on('message', route) + + // ---- 渲染层能看到的事件 (对应 ipc.ts 里 broadcastToRenderer) ---- + this.terminal.on('output', (sessionId, bytes, peerId) => + this.events.push({ kind: 'terminal:output', sessionId, peerId, data: bytes.toString('base64') })) + this.terminal.on('sessionOpened', (sessionId, peerId) => + this.events.push({ kind: 'terminal:opened', sessionId, peerId })) + this.terminal.on('sessionClosed', (sessionId, peerId, reason) => + this.events.push({ kind: 'terminal:closed', sessionId, peerId, reason })) + this.terminal.on('approvalRequested', (req) => + this.events.push({ kind: 'approval', peerId: req.peerId, text: req.detail })) + this.forward.on('sessionOpened', (i: any) => + this.events.push({ kind: 'forward:opened', sessionId: i.sessionId, peerId: i.peerId })) + this.forward.on('sessionClosed', (i: any) => + this.events.push({ kind: 'forward:closed', sessionId: i.sessionId, peerId: i.peerId, reason: i.reason })) + this.usb.on('output', (sessionId, bytes, peerId) => + this.events.push({ kind: 'usb:output', sessionId, peerId, data: bytes.toString('base64') })) + this.usb.on('sessionOpened', (i: any) => + this.events.push({ kind: 'usb:opened', sessionId: i.sessionId, peerId: i.peerId })) + this.usb.on('sessionClosed', (i: any) => + this.events.push({ kind: 'usb:closed', sessionId: i.sessionId, peerId: i.peerId, reason: i.reason })) + this.usb.on('sessionError', (i: any) => + this.events.push({ kind: 'usb:error', sessionId: i.sessionId, peerId: i.peerId, text: i.error })) + + this.client.on('error', (_peer, err) => console.warn(`[${this.info.name}] ws error: ${err.message}`)) + + // 追踪本端发出的帧 + if (TRACE) { + const origSend = this.client.send.bind(this.client) + ;(this.client as any).send = (frame: WsFrame, deviceId?: string) => { + const p: any = (frame as any).payload + console.log(`[trace ${this.info.name}] -> ${frame.type}${p ? `/${p.type}` : ''} ${p?.dir || ''} ${p?.sessionId?.slice(0, 8) || ''} ${p?.data ? `(${Buffer.from(p.data, 'base64').length}B)` : ''}`) + return origSend(frame, deviceId) + } + } + } + + connectTo(other: Node) { + this.client.connectTo({ ...other.info }) + } + + // 该节点收到的某个 kind 事件 (最近 n 秒内) + hasEvent(kind: string, pred?: (e: UiEvent) => boolean) { + return this.events.some(e => e.kind === kind && (!pred || pred(e))) + } + findEvents(kind: string) { return this.events.filter(e => e.kind === kind) } + clearEvents() { this.events = [] } + + async stop() { + try { await this.server.stop() } catch {} + try { this.client.stop() } catch {} + try { this.terminal.stop() } catch {} + try { this.forward.stop() } catch {} + try { this.usb.stop() } catch {} + } +} + +function decode(b64: string) { return Buffer.from(b64, 'base64').toString('utf8') } + +// ============ 小工具 ============ +function startHttpServer(port: number, body: string): Promise { + return new Promise((resolve, reject) => { + const s = createServer((req, res) => { + res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }) + res.end(body) + }) + s.on('error', reject) + s.listen(port, '127.0.0.1', () => resolve(s)) + }) +} + +// 发起 HTTP 请求, 收到完整响应后**保持连接** (隧道是单连接设计, 连接断了整个转发就结束) +function httpGet(port: number, path = '/', timeoutMs = 5000): Promise<{ body: string; sock: Socket }> { + return new Promise((resolve, reject) => { + const req = connect({ host: '127.0.0.1', port }, () => { + req.write(`GET ${path} HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: keep-alive\r\n\r\n`) + }) + let buf = '' + let settled = false + const finish = () => { + if (settled) return + settled = true + clearTimeout(timer) + resolve({ body: buf, sock: req }) + } + // 目标服务是 keep-alive, 连接不会自己关 —— 按 Content-Length 判完整, 别等 'end' + const tryComplete = () => { + const idx = buf.indexOf('\r\n\r\n') + if (idx < 0) return + const m = /content-length:\s*(\d+)/i.exec(buf.slice(0, idx)) + const need = m ? Number(m[1]) : 0 + if (buf.length >= idx + 4 + need) finish() + } + const timer = setTimeout(() => { if (!settled) { settled = true; reject(new Error(`http 超时 (收到 ${buf.length}B): ${buf.slice(0, 120)}`)) } }, timeoutMs) + req.on('data', (d) => { buf += d.toString('utf8'); tryComplete() }) + req.on('end', () => finish()) + req.on('error', (e) => { if (!settled) { settled = true; clearTimeout(timer); reject(e) } }) + }) +} + +function waitFor(pred: () => boolean, timeoutMs = 5000, stepMs = 50): Promise { + return new Promise((resolve, reject) => { + const t0 = Date.now() + const tick = () => { + if (pred()) return resolve() + if (Date.now() - t0 > timeoutMs) return reject(new Error('等待超时')) + setTimeout(tick, stepMs) + } + tick() + }) +} + +// 造一个 socat 串口对: 一头是 PTY (给被控端当真实串口), 另一头我们直接读写 +async function startSocatSerial(linkDir: string): Promise<{ proc: ChildProcess; userPath: string; internalPath: string }> { + const userPath = join(linkDir, 'user') + const internalPath = join(linkDir, 'internal') + const proc = spawn('socat', [ + '-d', '-d', + `pty,raw,echo=0,link=${userPath}`, + `pty,raw,echo=0,link=${internalPath}`, + ], { stdio: ['ignore', 'pipe', 'pipe'] }) + let err = '' + proc.stderr?.on('data', (b) => { err += b.toString() }) + const t0 = Date.now() + while (!(existsSync(userPath) && existsSync(internalPath))) { + if (Date.now() - t0 > 5000) { proc.kill(); throw new Error('socat 起不来: ' + err) } + await sleep(100) + } + return { proc, userPath, internalPath } +} + +// 打开 PTY 的一端做非阻塞读写 +function openPty(path: string) { + const fd = openSync(path, fs.constants.O_RDWR | fs.constants.O_NONBLOCK) + return { + fd, + write: (s: string | Buffer) => writeSync(fd, s), + read: (): string => { + const buf = Buffer.alloc(4096) + try { + const n = readSync(fd, buf, 0, buf.length, null) + return n > 0 ? buf.slice(0, n).toString('utf8') : '' + } catch (e: any) { + if (e?.code === 'EAGAIN' || e?.code === 'EWOULDBLOCK') return '' + throw e + } + }, + close: () => { try { closeSync(fd) } catch {} }, + } +} + +// ============ 主流程 ============ +async function main() { + const filter = process.argv.slice(2).filter(a => !a.startsWith('-')) + const want = (name: string) => !filter.length || filter.some(f => name.toLowerCase().includes(f.toLowerCase())) + const step = (m: string) => console.log(`[step] ${m}`) + + step('建节点 A') + const A = new Node('peer-aaaaaaaa-0000-4000-8000-00000000000a', '控制端A') + step('建节点 B') + const B = new Node('peer-bbbbbbbb-0000-4000-8000-00000000000b', '被控端B') + step('启动 A') + await A.start() + step('启动 B') + await B.start() + step(`节点就绪 A(:${A.info.chatPort}) B(:${B.info.chatPort})`) + + // 双向连通 (模拟 discovery 找到对方后双方都连上) + step('建立 WS 连接') + A.connectTo(B) + B.connectTo(A) + await waitFor(() => A.client.isOpen(B.info.deviceId) && B.client.isOpen(A.info.deviceId), 8000) + console.log(`\n两个节点已连通: A(:${A.info.chatPort}) <-> B(:${B.info.chatPort})\n`) + + // 授权: 双方互相放行, 避免弹窗 (等价于设置里勾了"允许") + updateSettings({ + remoteEnabled: true, + remoteAllowPeers: { + [A.info.deviceId]: { terminal: true, forward: true, usb: true }, + [B.info.deviceId]: { terminal: true, forward: true, usb: true }, + }, + }) + + // ============ 终端 ============ + console.log('\x1b[1m[终端]\x1b[0m') + let termSessionId = '' + const TERM_MARK = 'LNM_TERM_SELFTEST' + + if (want('terminal') || want('term')) { + await runCase('T1 打开终端: 控制端收到 ack ok', async () => { + const r = await A.terminal.openOnPeer(B.info.deviceId, { rows: 24, cols: 80 }) + assert(r.ok, `open 被拒: ${r.reason}`) + assert(!!r.sessionId, '没有 sessionId') + termSessionId = r.sessionId! + }) + + await runCase('T2 控制端能收到终端输出 (提示符/回显)', async () => { + const got = await waitFor(() => A.hasEvent('terminal:output'), 6000).then(() => true).catch(() => false) + assert(got, '控制端 6s 内没有收到任何 terminal:output 事件 —— 终端画面是空的') + const text = A.findEvents('terminal:output').map(e => decode(e.data!)).join('') + assert(text.length > 0, '收到的输出为空') + }) + + await runCase('T3 输入命令, 输出能回显到控制端', async () => { + A.clearEvents() + const ok = A.terminal.sendInput(termSessionId, `echo ${TERM_MARK}\n`) + assert(ok, 'sendInput 失败 (会话不存在?)') + await waitFor(() => A.findEvents('terminal:output').map(e => decode(e.data!)).join('').includes(TERM_MARK), 8000) + .catch(() => { throw new Error('8s 内没有看到命令回显 ' + TERM_MARK) }) + }) + + await runCase('T4 窗口尺寸 resize 能传到被控端', async () => { + A.terminal.resize(termSessionId, 40, 120) + await sleep(300) + const sess = B.terminal.listServerSessions().find(s => s.sessionId === termSessionId) + assert(!!sess, '被控端没有这个 session') + assert(sess!.rows === 40 && sess!.cols === 120, `被控端尺寸不对: ${sess!.rows}x${sess!.cols}`) + }) + + await runCase('T5 关闭终端: 被控端 session 被回收', async () => { + A.terminal.close(termSessionId, 'selftest') + await waitFor(() => B.terminal.listServerSessions().every(s => s.sessionId !== termSessionId), 5000) + .catch(() => { throw new Error('被控端 session 没有被回收') }) + }) + } + + // ============ 端口转发 ============ + console.log('\n\x1b[1m[端口转发]\x1b[0m') + if (want('forward') || want('for')) { + const targetPort = 47881 // 被控端的目标服务 + const listenPort = 47882 // 控制端的本地监听 + const peerListenPort = 47883 // 被控端的监听 (self-in) + const ctrlTargetPort = 47884 // 控制端的目标服务 (self-in) + const peerTarget = await startHttpServer(targetPort, 'HELLO-FROM-PEER') + const ctrlTarget = await startHttpServer(ctrlTargetPort, 'HELLO-FROM-CONTROL') + const openSocks: Socket[] = [] + try { + await runCase('F1 self-out: 控制端 127.0.0.1:47882 拿到被控端服务内容', async () => { + const r = await A.forward.openOnPeer(B.info.deviceId, { + direction: 'self-out', listenPort, targetHost: '127.0.0.1', targetPort, ttlSec: 120, + }) + assert(r.ok, `open 被拒: ${r.reason}`) + const { body, sock } = await httpGet(listenPort) + openSocks.push(sock) + assert(body.includes('HELLO-FROM-PEER'), `拿到的是: ${body.slice(0, 120)}`) + }) + + await runCase('F2 self-in: 被控端 127.0.0.1:47883 拿到控制端服务内容', async () => { + const r = await A.forward.openOnPeer(B.info.deviceId, { + direction: 'self-in', listenPort: peerListenPort, targetHost: '127.0.0.1', targetPort: ctrlTargetPort, ttlSec: 120, + }) + assert(r.ok, `open 被拒: ${r.reason}`) + const { body, sock } = await httpGet(peerListenPort) + openSocks.push(sock) + assert(body.includes('HELLO-FROM-CONTROL'), `拿到的是: ${body.slice(0, 120)}`) + }) + + await runCase('F3 拒绝把本机自身端口 (47900) 作为转发目标', async () => { + const r = await A.forward.openOnPeer(B.info.deviceId, { + direction: 'self-out', listenPort: 47890, targetHost: '127.0.0.1', targetPort: 47900, ttlSec: 60, + }) + assert(!r.ok, '自身端口竟然被放行了') + }) + + await runCase('F4 转发字节计数在两端都有记录', async () => { + const cs = A.forward.listClientSessions() + assert(cs.length > 0, '控制端没有转发 session') + const s = cs[0] + assert(s.bytesIn > 0 && s.bytesOut > 0, `字节计数不对: in=${s.bytesIn} out=${s.bytesOut}`) + }) + + await runCase('F5 关掉"对方发起的"转发: 对端 session 和监听端口都要释放', async () => { + // 由 B 发起: B bind 47885, A 作为 server 侧连 B 填的目标 + const r = await B.forward.openOnPeer(A.info.deviceId, { + direction: 'self-out', listenPort: 47885, targetHost: '127.0.0.1', targetPort: targetPort, ttlSec: 300, + }) + assert(r.ok, `B 发起转发失败: ${r.reason}`) + const serverSess = A.forward.listServerSessions().find(s => s.sessionId === r.sessionId) + assert(!!serverSess, 'A 侧没有对应的 server session (对方发起的)') + assert(B.forward.listClientSessions().some(s => s.sessionId === r.sessionId), 'B 侧 client session 不存在') + + // A 在 UI 上点"关闭" (对方发起的) —— 走 closeSession, 要能关掉 server 侧 + const closed = A.forward.closeSession(r.sessionId!, 'user') + assert(closed, 'closeSession 没关掉任何东西') + assert(A.forward.listServerSessions().every(s => s.sessionId !== r.sessionId), 'A 侧 server session 还在') + + // 关键: close 帧要发到对端, B 的 client session 及其监听端口要一起回收 + await waitFor(() => B.forward.listClientSessions().every(s => s.sessionId !== r.sessionId), 5000) + .catch(() => { throw new Error('对端的 client session 没被回收 (close 帧没发出去?)') }) + let portStillOpen = true + try { + await new Promise((res, rej) => { + const sock = connect({ host: '127.0.0.1', port: 47885 }, () => { sock.destroy(); res() }) + sock.on('error', () => rej(new Error('refused'))) + setTimeout(() => { sock.destroy(); rej(new Error('timeout')) }, 2000) + }) + } catch { portStillOpen = false } + assert(!portStillOpen, '对端的监听端口 47885 还占着, 没释放') + }) + } finally { + for (const s of openSocks) { try { s.destroy() } catch {} } + peerTarget.close(); ctrlTarget.close() + } + } + + // ============ USB / 串口 ============ + console.log('\n\x1b[1m[USB / 串口]\x1b[0m') + if (want('usb')) { + await runCase('U1 列对方设备: 请求-响应链路通', async () => { + const r = await A.usb.listOnPeer(B.info.deviceId) + assert(r.ok, `list 失败: ${r.reason}`) + assert(Array.isArray(r.devices), 'devices 不是数组') + }) + + await runCase('U2 USB 模式设备枚举 (libusb) 能列出真机设备', async () => { + const devs = await B.usb.listLocal() + const usbDevs = devs.filter(d => d.kind === 'usb') + console.log(` (枚举到 ${devs.length} 个设备, 其中 usb ${usbDevs.length} 个)`) + assert(usbDevs.length > 0, '一个 libusb 设备都没枚举到 —— USB 模式不可用') + }) + + await runCase('U2b 内核占用的设备: attach 失败原因能正确回传到控制端', async () => { + const devs = await B.usb.listLocal() + const usbDevs = devs.filter(d => d.kind === 'usb') + assert(usbDevs.length > 0, '没有可用的 usb 设备') + // 这台机器上的设备都被内核驱动占着 (键鼠/摄像头/蓝牙), 测试里不让它抢驱动 + const pick = usbDevs.find(d => /hub/i.test(d.product || '')) || usbDevs[0] + console.log(` (选用设备 ${pick.busId} ${pick.product || ''})`) + const r = await A.usb.attach(B.info.deviceId, { + busId: pick.busId, direction: 'self-out', + config: { kind: 'usb', configurationValue: 1, interfaceNumber: 0, detachKernelDriver: false }, + }) + // 期望: 要么成功, 要么失败原因能传回来 (而不是超时/静默) + if (!r.ok) { + console.log(` (按预期被内核占用挡住: ${r.reason})`) + assert(!!r.reason && r.reason.length > 0, '失败时没有给出原因') + } + }) + + await runCase('U2c 控制传输 setup 翻译正确, 真机 GET_DESCRIPTOR 能拿到数据', async () => { + const usbMod: any = require('usb') + const devs = await usbMod.webusb.loadDevices() + assert(devs.length > 0, 'libusb 枚举不到设备') + const dev = devs.find((d: any) => d.vendorId === 0x0c45 && d.productId === 0x6366) || devs[0] + await dev.open() + try { + // 用应用里同一套翻译函数 (bmRequestType 数值 -> node-usb v3 字符串枚举) + const setup = toUsbControlSetup({ requestType: 0x80, request: 0x06, value: 0x0100, index: 0x0000 }) + const buf = await dev.nativeControlTransferIn(setup, 3000, 18) + assert(!!buf && buf.length === 18, `描述符长度不对: ${buf?.length}`) + const hexd = Buffer.from(buf).toString('hex') + console.log(` (descriptor: ${hexd})`) + assert(hexd.startsWith('1201'), '不是合法的设备描述符') + } finally { + await dev.close().catch(() => {}) + } + }) + + // 串口双向字节流: 用 socat 造一个 PTY 对冒充"真串口" + const vcomDir = join(tmpdir(), `lnm-selftest-vcom-${Date.now()}`) + mkdirSync(vcomDir, { recursive: true }) + let socatProc: ChildProcess | null = null + let devEnd: ReturnType | null = null + try { + const pair = await startSocatSerial(vcomDir) + socatProc = pair.proc + // 被控端持有 "user" 端 (当真实串口), 测试这边拿 "internal" 端当外部设备 + B.usb.listLocal = async () => ([{ + busId: `serial:${pair.userPath}`, vid: 0, pid: 0, deviceClass: 0x02, deviceSubclass: 0x02, + product: 'selftest-pty', manufacturer: 'socat', kind: 'serial', serialPath: pair.userPath, baudRate: 115200, + }] as any) + + await runCase('U3 attach 串口: 控制端能拿到 attached ok', async () => { + const r = await A.usb.attach(B.info.deviceId, { + busId: `serial:${pair.userPath}`, direction: 'self-out', + config: { kind: 'serial', baudRate: 115200 }, + }) + assert(r.ok, `attach 被拒: ${r.reason}`) + }) + + await runCase('U4 串口双向字节流: 控制端 -> 设备', async () => { + const sess = A.usb.listClientSessions()[0] + assert(!!sess, '控制端没有 usb session') + devEnd = openPty(pair.internalPath) + const ok = await A.usb.sendSerialBytes(sess.sessionId, Buffer.from('HELLO-FROM-CONTROL\n')) + assert(ok, 'sendSerialBytes 失败') + // 设备端应该收到 + let seen = '' + for (let i = 0; i < 50 && !seen.includes('HELLO-FROM-CONTROL'); i++) { + await sleep(100) + seen += devEnd.read() + } + assert(seen.includes('HELLO-FROM-CONTROL'), `设备端没收到: ${JSON.stringify(seen)}`) + }) + + await runCase('U5 串口双向字节流: 设备 -> 控制端', async () => { + assert(!!devEnd, '设备端没准备好') + A.clearEvents() + devEnd.write('HELLO-FROM-DEVICE\n') + await waitFor(() => A.findEvents('usb:output').map(e => decode(e.data!)).join('').includes('HELLO-FROM-DEVICE'), 6000) + .catch(() => { throw new Error('控制端没收到设备发来的字节') }) + }) + } finally { + try { devEnd?.close() } catch {} + try { socatProc?.kill() } catch {} + try { rmSync(vcomDir, { recursive: true, force: true }) } catch {} + } + } + + // ============ 网盘 ============ + console.log('\n\x1b[1m[网盘]\x1b[0m') + if (want('drive') || want('网盘')) { + await runCase('D1 列对方网盘根目录', async () => { + const r = await listDrive(B.info, '') + assert(r.ok, `列目录失败: ${r.reason}`) + const names = (r.entries || []).map(e => e.name) + assert(names.includes('hello.txt'), `没看到 hello.txt, 实际: ${names.join(',')}`) + assert(names.includes('sub'), `没看到子目录 sub, 实际: ${names.join(',')}`) + const f = (r.entries || []).find(e => e.name === 'hello.txt')! + assert(f.size === 'HELLO-FROM-DRIVE'.length, `大小不对: ${f.size}`) + assert(!f.isDir, '文件被标成目录了') + }) + + await runCase('D2 进子目录再列一次', async () => { + const r = await listDrive(B.info, 'sub') + assert(r.ok, `列子目录失败: ${r.reason}`) + const names = (r.entries || []).map(e => e.name) + assert(names.includes('nested.txt'), `实际: ${names.join(',')}`) + }) + + await runCase('D3 下载文件: 内容一致', async () => { + const dest = join(tmpdir(), `lnm-selftest-dl-${Date.now()}`) + mkdirSync(dest, { recursive: true }) + const r = await downloadDriveFile({ peer: B.info, relPath: 'hello.txt', destDir: dest }) + assert(r.ok, `下载失败: ${r.reason}`) + const content = readFileSync(r.path!, 'utf8') + assert(content === 'HELLO-FROM-DRIVE', `内容不对: ${content}`) + assert(r.size === 'HELLO-FROM-DRIVE'.length, `大小不对: ${r.size}`) + }) + + await runCase('D4 下载子目录里的文件', async () => { + const dest = join(tmpdir(), `lnm-selftest-dl2-${Date.now()}`) + mkdirSync(dest, { recursive: true }) + const r = await downloadDriveFile({ peer: B.info, relPath: 'sub/nested.txt', destDir: dest }) + assert(r.ok, `下载失败: ${r.reason}`) + assert(readFileSync(r.path!, 'utf8') === 'NESTED-FROM-DRIVE', '内容不对') + }) + + await runCase('D5 目录穿越被挡住 (.. 逃不出网盘根)', async () => { + const r = await listDrive(B.info, '../../../../etc') + assert(!r.ok, '竟然列出了网盘之外的目录!') + const r2 = await listDrive(B.info, '..') + assert(!r2.ok, '竟然能列出上级目录!') + }) + + await runCase('D6 token 错误 -> 拒绝访问', async () => { + const bad = { ...B.info, driveToken: 'wrong-token' } + const r = await listDrive(bad, '') + assert(!r.ok, '错误 token 竟然能访问!') + assert(/令牌/.test(r.reason || ''), `错误信息不对: ${r.reason}`) + }) + + await runCase('D7 对方没开网盘 (无 token) -> 明确提示不支持', async () => { + const r = await listDrive({ ...B.info, driveToken: undefined }, '') + assert(!r.ok, '无 token 竟然能访问!') + assert(/不支持/.test(r.reason || ''), `错误信息不对: ${r.reason}`) + }) + + await runCase('D8 递归收集目录下的全部文件', async () => { + const r = await collectDriveFiles(B.info, 'sub') + assert(r.ok, `收集失败: ${r.reason}`) + const names = r.files.map(f => f.relPath).sort() + assert(names.includes('sub/nested.txt'), `缺 nested.txt: ${names.join(',')}`) + assert(names.includes('sub/deep/deeper.txt'), `缺深层文件: ${names.join(',')}`) + }) + + await runCase('D9 整目录下载: 保持层级', async () => { + const dest = join(tmpdir(), `lnm-selftest-dl3-${Date.now()}`) + mkdirSync(dest, { recursive: true }) + const collected = await collectDriveFiles(B.info, 'sub') + assert(collected.ok, '收集失败') + for (const f of collected.files) { + const relInside = f.relPath.slice('sub'.length).replace(/^[/\\]+/, '') + const dirInside = relInside ? dirname(relInside) : '' + const destSubPath = dirInside && dirInside !== '.' ? join('sub', dirInside) : 'sub' + const r = await downloadDriveFile({ peer: B.info, relPath: f.relPath, destDir: dest, destSubPath }) + assert(r.ok, `下载 ${f.relPath} 失败: ${r.reason}`) + } + assert(existsSync(join(dest, 'sub', 'nested.txt')), '层级不对: 少了 sub/nested.txt') + assert(existsSync(join(dest, 'sub', 'deep', 'deeper.txt')), '层级不对: 少了 sub/deep/deeper.txt') + assert(readFileSync(join(dest, 'sub', 'deep', 'deeper.txt'), 'utf8') === 'DEEPER-FROM-DRIVE', '内容不对') + }) + } + + // ============ 消息通道状态 ============ + // 回归: 启动时主进程先连上对端, 渲染层后订阅 -> open 事件被丢掉, UI 永久显示"等待重连" + // 所以状态必须是"拉取式"的: 任何时刻去查都能查到当前真实状态 + if (want('ws') || want('state')) { + console.log('\n\x1b[1m[通道状态]\x1b[0m') + + await runCase('W1 通道状态可随时拉取 (连接早已建好, 现在才查也查得到)', async () => { + assert(A.client.isOpen(B.info.deviceId), '前提不成立: A->B 的 outgoing 没开') + // 模拟"渲染层晚订阅": 此刻才去查状态 + const st = computeWsState([B.info.deviceId], A.client.getStatus(), A.server) + assert(st[B.info.deviceId] === true, `状态不对: ${JSON.stringify(st)}`) + }) + + await runCase('W2 只有 inbound 通 (对方连我, 我没主动连) 也算通道可用', async () => { + const C = new Node('peer-cccccccc-0000-4000-8000-00000000000c', '只入站C') + await C.start() + try { + B.connectTo(C) // 只有 B -> C 这一条腿 + await waitFor(() => C.server.isConnected(B.info.deviceId), 8000) + assert(!C.client.isOpen(B.info.deviceId), '前提不成立: C 不该有 outgoing 连接') + const st = computeWsState([B.info.deviceId], C.client.getStatus(), C.server) + assert(st[B.info.deviceId] === true, `只有 inbound 通时不该判死: ${JSON.stringify(st)}`) + } finally { + await C.stop() + } + }) + + await runCase('W3 两条腿都断了 -> 状态回落 false', async () => { + A.client.remove(B.info.deviceId) + B.client.remove(A.info.deviceId) + await waitFor(() => !A.server.isConnected(B.info.deviceId), 5000) + await waitFor(() => !B.server.isConnected(A.info.deviceId), 5000) + const st = computeWsState([B.info.deviceId], A.client.getStatus(), A.server) + assert(st[B.info.deviceId] === false, `断了还报可用: ${JSON.stringify(st)}`) + }) + } + + // ============ 审计 ============ + if (want('audit')) { + console.log('\n\x1b[1m[审计]\x1b[0m') + await runCase('A1 关键操作都写进了 audit_log', async () => { + const rows = listAudit({ limit: 200 }) + const actions = new Set(rows.map(r => r.action)) + const need = ['terminal.open', 'forward.open'] + for (const n of need) assert(actions.has(n), `audit 里没有 ${n} (现有: ${[...actions].join(', ')})`) + }) + } + + // ============ 汇总 ============ + await A.stop() + await B.stop() + + const pass = results.filter(r => r.ok).length + const fail = results.length - pass + console.log(`\n\x1b[1m结果: ${pass} 通过 / ${fail} 失败\x1b[0m`) + if (fail) { + console.log('\n失败用例:') + for (const r of results.filter(x => !x.ok)) console.log(` - ${r.name}\n ${r.detail}`) + } + process.exit(fail ? 1 : 0) +} + +main().catch((e) => { + console.error('自测脚本异常:', e) + process.exit(2) +}) diff --git a/scripts/selftest/pty-shim.cjs b/scripts/selftest/pty-shim.cjs new file mode 100644 index 0000000..090b986 --- /dev/null +++ b/scripts/selftest/pty-shim.cjs @@ -0,0 +1,15 @@ +// @lydell/node-pty 的 module.exports 带 __esModule 标记 (非枚举), +// esbuild 的 __toESM interop 会因此认为它"没有 default 导出", +// 导致 terminal.ts 里的 `(nodePty as any).default ?? nodePty` 变成 undefined.default. +// 这里包一层, 重新导出一个"干净"的 CJS 对象. +// +// 注意: 必须用变量拼包名, 否则 esbuild 的 --alias 会把这里的 require 也重写成指向自己. +const PKG = '@lydell/node-pty' +const m = require(PKG) +module.exports = { + spawn: m.spawn, + fork: m.fork, + createTerminal: m.createTerminal, + open: m.open, + native: m.native, +} diff --git a/src/main/chat-server.ts b/src/main/chat-server.ts index e476571..ab34060 100644 --- a/src/main/chat-server.ts +++ b/src/main/chat-server.ts @@ -25,20 +25,31 @@ export class ChatServer extends EventEmitter { super() this.port = port this.wss = new WebSocketServer({ port, host: '0.0.0.0' }) + // 连接处理必须在这里挂: ws 在构造时就 listen, 'listening' 事件可能早于 start() 挂监听而丢失, + // 那种情况下 start() 走 "已在监听" 分支, 不会再走到下面的 on('connection') + this.wss.on('connection', (ws, req) => this.onConnection(ws, req)) } getPort(): number { - return this.wss.address() as { port: number } | null as any + const addr = this.wss.address() + return typeof addr === 'object' && addr ? addr.port : this.port } start(): Promise { return new Promise((resolve, reject) => { + // ws 的 WebSocketServer 在构造时就 listen 了, 'listening' 事件可能早于本方法挂监听而丢失 + // (例如同一 tick 里先 await 了别的东西再调 start()) —— 这里先看是否已经在监听 + const addr = this.wss.address() + if (addr && typeof addr === 'object' && addr.port) { + this.port = addr.port + resolve(addr.port) + return + } this.wss.once('error', reject) this.wss.once('listening', () => { - const addr = this.wss.address() - const realPort = typeof addr === 'object' && addr ? addr.port : this.port + const a = this.wss.address() + const realPort = typeof a === 'object' && a ? a.port : this.port this.port = realPort - this.wss.on('connection', (ws, req) => this.onConnection(ws, req)) resolve(realPort) }) }) @@ -116,6 +127,13 @@ export class ChatServer extends EventEmitter { return true } + // 该设备是否有活着的入站连接 (对方主动连过来的 ws) + // 与 chat-client 的 outgoing 相对: 任何一条通, 消息通道就是通的 + isConnected(deviceId: string): boolean { + const ws = this.sockets.get(deviceId) + return !!ws && ws.readyState === WebSocket.OPEN + } + async stop() { for (const ws of this.sockets.values()) { try { ws.close(1001, 'server shutdown') } catch {} diff --git a/src/main/db.ts b/src/main/db.ts index 228cf81..1da5610 100644 --- a/src/main/db.ts +++ b/src/main/db.ts @@ -20,7 +20,8 @@ CREATE TABLE IF NOT EXISTS devices ( app_version TEXT, last_ip TEXT, last_seen INTEGER NOT NULL, - ignored INTEGER NOT NULL DEFAULT 0 + ignored INTEGER NOT NULL DEFAULT 0, + drive_token TEXT ); CREATE TABLE IF NOT EXISTS messages ( @@ -63,6 +64,8 @@ CREATE INDEX IF NOT EXISTS idx_audit_session ON audit_log(session_id); // 迁移: 给老库补 ignored 列 (用 try/catch 包住, 已存在会抛) try { db.exec(`ALTER TABLE devices ADD COLUMN ignored INTEGER NOT NULL DEFAULT 0`) } catch {} +// 迁移: 给老库补 drive_token 列 (网盘访问令牌, 老版本没有) +try { db.exec(`ALTER TABLE devices ADD COLUMN drive_token TEXT`) } catch {} // conversation_key: 任意两个 deviceId 排序后 join, 1对1 export function conversationKey(a: string, b: string): string { @@ -79,18 +82,20 @@ export interface DeviceRow { last_ip: string | null last_seen: number ignored: number // 0/1 + drive_token: string | null // 网盘访问令牌 (对端用它访问我的网盘) } const upsertDeviceStmt = db.prepare(` -INSERT INTO devices (device_id, name, hostname, platform, app_version, last_ip, last_seen) -VALUES (@device_id, @name, @hostname, @platform, @app_version, @last_ip, @last_seen) +INSERT INTO devices (device_id, name, hostname, platform, app_version, last_ip, last_seen, drive_token) +VALUES (@device_id, @name, @hostname, @platform, @app_version, @last_ip, @last_seen, @drive_token) ON CONFLICT(device_id) DO UPDATE SET name = excluded.name, hostname = excluded.hostname, platform = excluded.platform, app_version = excluded.app_version, last_ip = excluded.last_ip, - last_seen = excluded.last_seen + last_seen = excluded.last_seen, + drive_token = excluded.drive_token `) export function upsertDevice(d: DeviceRow) { diff --git a/src/main/drive.ts b/src/main/drive.ts new file mode 100644 index 0000000..d3ce9f4 --- /dev/null +++ b/src/main/drive.ts @@ -0,0 +1,213 @@ +// 网盘客户端: 从对端的 HTTP 文件服务拉目录列表 / 下载文件到本地 +// +// 对端接口 (src/main/file-server.ts): +// GET /drive/meta?token= -> { ok, dir } +// GET /drive/list?token=&path= -> { ok, path, entries[] } +// GET /drive/download?token=&path= -> 文件流 +// +// token 由对端在局域网发现包里广播, 没 token = 对端不支持网盘 (老版本) + +import { request as httpRequest, get as httpGet } from 'node:http' +import { createWriteStream, existsSync, mkdirSync, unlinkSync } from 'node:fs' +import { join, basename, dirname } from 'node:path' +import { randomUUID } from 'node:crypto' +import type { DeviceInfo } from './protocol' + +export interface DriveEntryView { + name: string + path: string + size: number + mtime: number + isDir: boolean +} + +export interface DriveListResult { + ok: boolean + reason?: string + path?: string + entries?: DriveEntryView[] + /** 对端网盘根目录 (本机路径, 仅提示用) */ + root?: string +} + +/** 对端是否支持网盘 (有没有广播 token) */ +export function peerSupportsDrive(peer: { driveToken?: string } | null | undefined): boolean { + return !!(peer && peer.driveToken) +} + +function driveBase(peer: DeviceInfo): { host: string; port: number; token: string } | null { + const token = peer.driveToken + if (!token) return null + const host = peer.address + if (!host) return null + const port = peer.filePort + if (!port) return null + return { host, port, token } +} + +/** 列出对端网盘某个目录 (relPath 为相对网盘根的路径, '' = 根) */ +export function listDrive(peer: DeviceInfo, relPath = '', timeoutMs = 8000): Promise { + const base = driveBase(peer) + if (!base) return Promise.resolve({ ok: false, reason: '对方版本不支持网盘' }) + + const q = `token=${encodeURIComponent(base.token)}&path=${encodeURIComponent(relPath)}` + const url = `http://${base.host}:${base.port}/drive/list?${q}` + return new Promise((resolve) => { + const req = httpGet(url, { timeout: timeoutMs }, (res) => { + const chunks: Buffer[] = [] + res.on('data', (c) => chunks.push(c)) + res.on('end', () => { + try { + const data = JSON.parse(Buffer.concat(chunks).toString('utf8')) + if (res.statusCode === 403) return resolve({ ok: false, reason: data?.error || '网盘令牌无效 (对方可能改了设置)' }) + if (!data?.ok) return resolve({ ok: false, reason: data?.error || '读取失败' }) + resolve({ ok: true, path: data.path, entries: data.entries || [] }) + } catch (e: any) { + resolve({ ok: false, reason: e?.message || '解析失败' }) + } + }) + }) + req.on('timeout', () => { req.destroy(); resolve({ ok: false, reason: '读取超时' }) }) + req.on('error', (e) => resolve({ ok: false, reason: e?.message || '连接失败' })) + }) +} + +/** 取对端网盘根目录 (只用于显示"对方的网盘在 xxx") */ +export function getDriveRoot(peer: DeviceInfo, timeoutMs = 8000): Promise<{ ok: boolean; dir?: string; reason?: string }> { + const base = driveBase(peer) + if (!base) return Promise.resolve({ ok: false, reason: '对方版本不支持网盘' }) + const url = `http://${base.host}:${base.port}/drive/meta?token=${encodeURIComponent(base.token)}` + return new Promise((resolve) => { + const req = httpGet(url, { timeout: timeoutMs }, (res) => { + const chunks: Buffer[] = [] + res.on('data', (c) => chunks.push(c)) + res.on('end', () => { + try { + const data = JSON.parse(Buffer.concat(chunks).toString('utf8')) + resolve({ ok: !!data?.ok, dir: data?.dir, reason: data?.error }) + } catch (e: any) { + resolve({ ok: false, reason: e?.message || '解析失败' }) + } + }) + }) + req.on('timeout', () => { req.destroy(); resolve({ ok: false, reason: '读取超时' }) }) + req.on('error', (e) => resolve({ ok: false, reason: e?.message || '连接失败' })) + }) +} + +export interface DriveDownloadOptions { + peer: DeviceInfo + /** 对端网盘里的相对路径 */ + relPath: string + /** 本地保存目录 */ + destDir: string + /** 存到 destDir 下的相对子路径 (下载整个目录时用来保持层级) */ + destSubPath?: string + onProgress?: (sent: number, total: number) => void +} + +/** 递归收集目录下的所有文件 (返回相对网盘根的路径) */ +export async function collectDriveFiles( + peer: DeviceInfo, + relPath: string, + out: { relPath: string; size: number }[] = [], + depth = 0, +): Promise<{ ok: boolean; reason?: string; files: { relPath: string; size: number }[] }> { + if (depth > 12) return { ok: false, reason: '目录层级太深', files: out } + const r = await listDrive(peer, relPath) + if (!r.ok) { + // 不是目录 -> 当作单个文件 + if (depth === 0) return { ok: true, files: [{ relPath, size: 0 }] } + return { ok: false, reason: r.reason, files: out } + } + for (const e of r.entries || []) { + if (e.isDir) { + const sub = await collectDriveFiles(peer, e.path, out, depth + 1) + if (!sub.ok) return sub + } else { + out.push({ relPath: e.path, size: e.size }) + } + } + return { ok: true, files: out } +} + +/** 从对端网盘下载一个文件到本地目录 (重名自动加 _1) */ +export function downloadDriveFile(opts: DriveDownloadOptions): Promise<{ ok: boolean; path?: string; size?: number; reason?: string }> { + const base = driveBase(opts.peer) + if (!base) return Promise.resolve({ ok: false, reason: '对方版本不支持网盘' }) + if (!existsSync(opts.destDir)) mkdirSync(opts.destDir, { recursive: true }) + + const name = basename(opts.relPath) || 'file' + // 保持目录层级: destSubPath 里的目录要先建出来 + const subDir = opts.destSubPath ? join(opts.destDir, opts.destSubPath) : opts.destDir + if (!existsSync(subDir)) mkdirSync(subDir, { recursive: true }) + const target = uniquePath(join(subDir, name)) + const path = `/drive/download?token=${encodeURIComponent(base.token)}&path=${encodeURIComponent(opts.relPath)}` + + return new Promise((resolve) => { + let sent = 0 + let total = 0 + let lastEmit = 0 + let failed = false + const ws = createWriteStream(target) + + const fail = (reason: string) => { + if (failed) return + failed = true + try { ws.destroy() } catch {} + try { unlinkSync(target) } catch {} + resolve({ ok: false, reason }) + } + + const req = httpRequest({ host: base.host, port: base.port, method: 'GET', path, timeout: 120_000 }) + req.on('timeout', () => { req.destroy(new Error('下载超时')); fail('下载超时') }) + req.on('error', (e) => fail(e?.message || '下载失败')) + req.on('response', (res) => { + if (res.statusCode !== 200) { + const chunks: Buffer[] = [] + res.on('data', (c) => chunks.push(c)) + res.on('end', () => { + let msg = `HTTP ${res.statusCode}` + try { msg = JSON.parse(Buffer.concat(chunks).toString('utf8'))?.error || msg } catch {} + fail(msg) + }) + return + } + const len = res.headers['content-length'] + total = len ? Number(len) : 0 + res.on('data', (chunk: Buffer) => { + sent += chunk.length + const now = Date.now() + if (now - lastEmit >= 100 || (total && sent >= total)) { + lastEmit = now + opts.onProgress?.(sent, total || sent) + } + }) + res.pipe(ws) + ws.on('finish', () => { + opts.onProgress?.(sent, total || sent) + resolve({ ok: true, path: target, size: sent }) + }) + ws.on('error', (e) => fail(e?.message || '写入失败')) + }) + req.end() + }) +} + +// 同名文件自动加 _1, _2 ... +function uniquePath(p: string): string { + if (!existsSync(p)) return p + const dir = dirname(p) + const ext = p.includes('.') && !p.endsWith('.') ? p.slice(p.lastIndexOf('.')) : '' + const stem = ext ? p.slice(0, p.length - ext.length) : p + for (let i = 1; i < 9999; i++) { + const cand = `${stem}_${i}${ext}` + if (!existsSync(cand)) return cand + } + return `${stem}_${Date.now()}${ext}` +} + +/** 生成一个批次 id (下载任务用) */ +export function newBatchId(): string { + return randomUUID() +} diff --git a/src/main/file-server.ts b/src/main/file-server.ts index 3f3f9ef..2d8fe6b 100644 --- a/src/main/file-server.ts +++ b/src/main/file-server.ts @@ -10,16 +10,38 @@ import { createServer, IncomingMessage, ServerResponse } from 'node:http' import { EventEmitter } from 'node:events' -import { createWriteStream, existsSync, statSync, mkdirSync } from 'node:fs' +import { createWriteStream, existsSync, statSync, mkdirSync, readdirSync } from 'node:fs' import { createReadStream } from 'node:fs' import { mkdir, stat, unlink, rename } from 'node:fs/promises' -import { join, extname, resolve, basename } from 'node:path' +import { join, extname, resolve, basename, sep } from 'node:path' import { createHash, randomUUID } from 'node:crypto' import { getSettings } from './settings' export interface FileServerEvents { received: [info: { fileId: string; name: string; size: number; mime: string; savedPath: string; hash: string; fromAddr: string }] progress: [info: { fileId: string; sent: number; total: number; fromAddr: string }] + /** 对端从我的网盘下载了一个文件 */ + driveDownloaded: [info: { name: string; size: number; relPath: string; fromAddr: string }] +} + +/** 网盘接口的回调 (设置项运行时可变, 所以用 getter 而不是固定值) */ +export interface DriveOptions { + /** 网盘根目录 (对端只能看到这个目录里的内容) */ + getDriveRoot: () => string + /** 访问令牌; 返回空 = 不提供网盘服务 */ + getDriveToken: () => string | undefined + /** 总开关 */ + isDriveEnabled: () => boolean +} + +/** 网盘目录里的一个条目 */ +export interface DriveEntry { + name: string + /** 相对网盘根目录的路径 (给对端用) */ + path: string + size: number + mtime: number + isDir: boolean } // 单文件大小上限, 默认 100GB (LAN 局域网传大视频常见, 不限太死) @@ -63,11 +85,13 @@ export class FileServer extends EventEmitter { private server = createServer((req, res) => this.handle(req, res)) private port: number private root: string + private drive: DriveOptions | null = null - constructor(port: number, root: string) { + constructor(port: number, root: string, drive?: DriveOptions) { super() this.port = port this.root = root + this.drive = drive || null } start(): Promise { @@ -130,12 +154,104 @@ export class FileServer extends EventEmitter { await this.handleGetFile(url, res) return } + // ---- 网盘 ---- + if (url.startsWith('/drive/') && req.method === 'GET') { + await this.handleDrive(req, url, res) + return + } this.json(res, 404, { ok: false, error: 'not found' }) } catch (e: any) { this.json(res, 500, { ok: false, error: e?.message || 'server error' }) } } + // ========== 网盘 ========== + + // 把对端传来的相对路径解析成绝对路径, 并确保没有跳出网盘根目录 + private resolveDrivePath(rel: string): { abs: string; root: string } | null { + if (!this.drive) return null + const root = resolve(this.drive.getDriveRoot()) + const clean = (rel || '').replace(/^[/\\]+/, '') + const abs = resolve(join(root, clean)) + // 必须严格在 root 之内 (相等或以 root + sep 开头) + if (abs !== root && !abs.startsWith(root + sep)) return null + return { abs, root } + } + + private driveTokenOk(token: string | null): boolean { + if (!this.drive) return false + if (!this.drive.isDriveEnabled()) return false + const expect = this.drive.getDriveToken() + if (!expect) return false + return !!token && token === expect + } + + private async handleDrive(req: IncomingMessage, url: string, res: ServerResponse) { + const qIdx = url.indexOf('?') + const params = new URLSearchParams(qIdx < 0 ? '' : url.slice(qIdx + 1)) + const token = params.get('token') + + if (!this.drive || !this.drive.isDriveEnabled()) { + this.json(res, 404, { ok: false, error: '网盘未开启' }) + return + } + if (!this.driveTokenOk(token)) { + this.json(res, 403, { ok: false, error: '网盘令牌无效' }) + return + } + + const route = url.slice('/drive/'.length, qIdx < 0 ? undefined : qIdx) + if (route === 'meta') { + this.json(res, 200, { ok: true, dir: this.drive.getDriveRoot() }) + return + } + if (route === 'list') { + const rel = params.get('path') || '' + const r = this.resolveDrivePath(rel) + if (!r) { this.json(res, 400, { ok: false, error: '非法路径' }); return } + let st: any + try { st = statSync(r.abs) } catch { this.json(res, 404, { ok: false, error: '目录不存在' }); return } + if (!st.isDirectory()) { this.json(res, 400, { ok: false, error: '不是目录' }); return } + let names: string[] = [] + try { names = readdirSync(r.abs) } catch { this.json(res, 500, { ok: false, error: '读取目录失败' }); return } + const entries: DriveEntry[] = [] + for (const name of names) { + try { + const s = statSync(join(r.abs, name)) + const relPath = rel ? `${rel.replace(/[/\\]+$/, '')}/${name}` : name + entries.push({ + name, path: relPath, size: s.isDirectory() ? 0 : s.size, + mtime: s.mtimeMs, isDir: s.isDirectory(), + }) + } catch { /* 单个条目 stat 失败就跳过 */ } + } + // 目录在前, 同类按名称排 + entries.sort((a, b) => (a.isDir === b.isDir ? a.name.localeCompare(b.name, 'zh-CN') : (a.isDir ? -1 : 1))) + this.json(res, 200, { ok: true, path: rel, entries }) + return + } + if (route === 'download') { + const rel = params.get('path') || '' + const r = this.resolveDrivePath(rel) + if (!r) { this.json(res, 400, { ok: false, error: '非法路径' }); return } + let st: any + try { st = statSync(r.abs) } catch { this.json(res, 404, { ok: false, error: '文件不存在' }); return } + if (!st.isFile()) { this.json(res, 400, { ok: false, error: '不是文件' }); return } + res.statusCode = 200 + res.setHeader('Content-Length', String(st.size)) + res.setHeader('Content-Type', 'application/octet-stream') + res.setHeader('Content-Disposition', `attachment; filename="${encodeURIComponent(basename(r.abs))}"`) + res.setHeader('Access-Control-Allow-Origin', '*') + this.emit('driveDownloaded', { + name: basename(r.abs), size: st.size, relPath: rel, + fromAddr: req.socket.remoteAddress || '', + }) + createReadStream(r.abs).pipe(res) + return + } + this.json(res, 404, { ok: false, error: 'not found' }) + } + private json(res: ServerResponse, code: number, data: any) { res.statusCode = code res.setHeader('Content-Type', 'application/json; charset=utf-8') diff --git a/src/main/index.ts b/src/main/index.ts index 3b5cb5a..584ca41 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -6,7 +6,7 @@ import { randomUUID } from 'node:crypto' import { hostname, platform } from 'node:os' import { paths } from './paths' -import { getSettings, ensureDownloadDir } from './settings' +import { getSettings, ensureDownloadDir, ensureDriveDir } from './settings' import { ensureIconFile } from './icons' import { createMainWindow, broadcastToRenderer } from './window' import { createTray } from './tray' @@ -17,7 +17,7 @@ import { FileServer } from './file-server' import { TerminalManager } from './remote/terminal' import { ForwardManager } from './remote/forward' import { UsbBridgeManager } from './remote/usb' -import { registerIpc, bindNetworkContext } from './ipc' +import { registerIpc, bindNetworkContext, collectWsState } from './ipc' import { listDevices, totalUnread, getUnread, pruneAudit } from './db' import { setBadgeCount } from './notify' import { DEFAULT_PORTS, PROTOCOL_VERSION } from './protocol' @@ -60,7 +60,11 @@ async function main() { const discovery = new Discovery(self) const chatServer = new ChatServer(DEFAULT_PORTS.chat) const chatClient = new ChatClient(self) - const fileServer = new FileServer(DEFAULT_PORTS.file, ensureDownloadDir()) + const fileServer = new FileServer(DEFAULT_PORTS.file, ensureDownloadDir(), { + getDriveRoot: () => ensureDriveDir(), + getDriveToken: () => getDriveToken(), + isDriveEnabled: () => getSettings().driveEnabled !== false, + }) const terminal = new TerminalManager(chatClient, self.deviceId) const forward = new ForwardManager(chatClient) const usb = new UsbBridgeManager(chatClient) @@ -130,6 +134,28 @@ function buildSelf(): DeviceInfo { chatPort: 0, filePort: 0, ts: Date.now(), + driveToken: getDriveToken(), + } +} + +// 网盘访问令牌: 一次生成, 长期不变 (对端在发现包里拿到它) +let driveTokenCache: string | null = null +export function getDriveToken(): string { + if (driveTokenCache) return driveTokenCache + const f = join(paths.appData, 'drive.token') + try { + if (existsSync(f)) { + const t = readFileSync(f, 'utf8').trim() + if (t) { driveTokenCache = t; return t } + } + const t = randomUUID().replace(/-/g, '') + writeFileSync(f, t, 'utf8') + driveTokenCache = t + return t + } catch { + // 落盘失败也要能用 (内存 token, 重启后失效) + driveTokenCache = randomUUID().replace(/-/g, '') + return driveTokenCache } } @@ -137,5 +163,7 @@ function pushInitialState() { broadcastToRenderer('boot:ready', { settings: getSettings(), unread: getUnread(), + // 带上 WS 通道状态快照: 渲染层订阅前发生的连接事件不会重放, 只能在这里补一次 + ws: collectWsState(), }) } diff --git a/src/main/ipc.ts b/src/main/ipc.ts index 7ddac2e..aca8cfd 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -2,10 +2,10 @@ import { ipcMain, dialog, shell, BrowserWindow, app } from 'electron' import { randomUUID } from 'node:crypto' import { existsSync, statSync, readFileSync } from 'node:fs' -import { basename } from 'node:path' +import { basename, join, dirname } from 'node:path' import { promises as fsp } from 'node:fs' -import { getSettings, updateSettings, ensureDownloadDir } from './settings' +import { getSettings, updateSettings, ensureDownloadDir, ensureDriveDir } from './settings' import { db, upsertDevice, listDevices, listMessages, insertMessage, getMessage, updateMessageStatus, updateMessageBody, deleteMessage, conversationKey, incrUnread, clearUnread, @@ -17,6 +17,7 @@ import { Discovery, listNetInterfaces, type NetInterface } from './discovery' import { ChatServer } from './chat-server' import { ChatClient } from './chat-client' import { FileServer, uploadFile, uploadBuffer } from './file-server' +import { listDrive, getDriveRoot, downloadDriveFile, collectDriveFiles } from './drive' import { broadcastToRenderer, focusMainWindow } from './window' import { rebuildMenu } from './tray' import { notify, setBadgeCount } from './notify' @@ -24,7 +25,9 @@ import { TerminalManager } from './remote/terminal' import { ForwardManager } from './remote/forward' import { UsbBridgeManager } from './remote/usb' import { enqueueApproval, listPendingApprovals, replyApproval } from './remote/approval' +import { computeWsState } from './ws-state' import type { DeviceInfo, MessageEnvelope, MessageBody, ImageMessage, FileMessage, TextMessage, SystemMessage, ReplyRef, TerminalFrame, ForwardFrame, UsbFrame, UsbDeviceInfo, UsbDirection, UsbAttachConfig } from './protocol' +import { DEFAULT_PORTS } from './protocol' interface NetCtx { self: DeviceInfo @@ -39,6 +42,32 @@ interface NetCtx { let ctx: NetCtx | null = null +// 收集所有对端的"消息通道"状态 +export function collectWsState(): Record { + if (!ctx) return {} + return computeWsState( + ctx.discovery.getPeers().map(p => p.deviceId), + ctx.chatClient.getStatus(), + ctx.chatServer, + ) +} + +// 对端是否还"在线": discovery 能看到它, 或还有任一条 WS 通道活着 +function isPeerReachable(deviceId: string): boolean { + if (!ctx) return false + if (ctx.chatServer.isConnected(deviceId)) return true + if (ctx.chatClient.getStatus()[deviceId] === 'open') return true + return ctx.discovery.getPeers().some(p => p.deviceId === deviceId) +} + +// 广播 WS 通道状态全量快照 +// 用"全量快照"而不是"单个设备的增量事件": 增量事件在渲染层还没订阅时会被丢弃, +// 启动阶段主进程往往先连上对端 (index.ts 里 connectTo 早于 createMainWindow), +// 渲染层 mount 后就再也收不到那条 open, UI 会永久停在"等待重连"。 +function broadcastWsState() { + broadcastToRenderer('device:wsState', { ws: collectWsState() }) +} + // 接收端: 收到的 WS metadata 帧但还没拿到文件本体, 启动 N 秒期待 timer // 任一进度事件或 received 完成事件取消; 到了 -> 只通知 sender, 不自动删消息 // 气泡留在 receiving 状态, 让用户右键手动删 @@ -72,7 +101,8 @@ export function bindNetworkContext(c: NetCtx) { if (getDevice(d.deviceId)?.ignored) return upsertDevice({ device_id: d.deviceId, name: d.name, hostname: d.hostname, platform: d.platform, - app_version: d.appVersion, last_ip: d.address, last_seen: Date.now(), ignored: 0 + app_version: d.appVersion, last_ip: d.address, last_seen: Date.now(), ignored: 0, + drive_token: d.driveToken || null, }) broadcastToRenderer('device:found', d) c.chatClient.connectTo(d) @@ -81,7 +111,8 @@ export function bindNetworkContext(c: NetCtx) { if (getDevice(d.deviceId)?.ignored) return upsertDevice({ device_id: d.deviceId, name: d.name, hostname: d.hostname, platform: d.platform, - app_version: d.appVersion, last_ip: d.address, last_seen: Date.now(), ignored: 0 + app_version: d.appVersion, last_ip: d.address, last_seen: Date.now(), ignored: 0, + drive_token: d.driveToken || null, }) broadcastToRenderer('device:updated', d) c.chatClient.connectTo(d) @@ -205,6 +236,9 @@ export function bindNetworkContext(c: NetCtx) { }) c.chatServer.on('connect', (_ws, peer) => { + // 先推通道状态再推在线事件: 渲染层收到 "offline" 时会查通道状态决定要不要真标离线, + // 顺序反了它读到的是旧快照, 会把刚断开的设备继续留在"在线" + broadcastWsState() broadcastToRenderer('device:online', { deviceId: peer.deviceId, address: peer.address }) // 对端上线 -> 触发离线消息 flush flushPendingFor(peer.deviceId) @@ -221,14 +255,20 @@ export function bindNetworkContext(c: NetCtx) { // "discovery 在线" 和 "WS 在线"; 同时 open 时主动 flush 一次待发消息 (双端 WS 都建好后必走 chat-server.on('connect') 那条路, // 但如果对方先来认我们这边, 我们 outgoing 还没通, flush 在自己这条线路上反而能立刻推) c.chatClient.on('open', (peer) => { - broadcastToRenderer('device:wsState', { deviceId: peer.deviceId, wsOpen: true }) + broadcastWsState() flushPendingFor(peer.deviceId) }) c.chatClient.on('close', (peer) => { - broadcastToRenderer('device:wsState', { deviceId: peer.deviceId, wsOpen: false }) + broadcastWsState() + // 两条腿都断了, discovery 也不认识它了 -> 确实离线, 不用等 discovery 的 15s 超时 + if (!isPeerReachable(peer.deviceId)) { + broadcastToRenderer('device:offline', { deviceId: peer.deviceId }) + } }) c.chatServer.on('disconnect', (id) => { + // 先推通道状态再推离线事件 (理由同 'connect') + broadcastWsState() broadcastToRenderer('device:offline', { deviceId: id }) }) @@ -246,6 +286,18 @@ export function bindNetworkContext(c: NetCtx) { disarmPendingMetaTimer(info.fileId) }) + // 对端从我的网盘下载了文件 -> 本机提示 + 审计 + c.fileServer.on('driveDownloaded', (info: { name: string; size: number; relPath: string; fromAddr: string }) => { + const peer = ctx?.discovery.getPeers().find(p => p.address === info.fromAddr) + const who = peer ? peer.name : info.fromAddr || '某台设备' + recordAudit({ + action: 'drive.download', source: peer?.deviceId || info.fromAddr, + result: 'ok', + payload: { name: info.name, size: info.size, path: info.relPath }, + }) + broadcastToRenderer('drive:inbound', { name: info.name, size: info.size, peerId: peer?.deviceId, peerName: who }) + }) + // 对端发起撤回 — 本地默默删 (含磁盘文件), 不弹框不提示 c.chatServer.on('recall', (from, messageId) => { const row = getMessage(messageId) @@ -443,6 +495,11 @@ export function registerIpc() { // ---- 设备 / 自身 ---- ipcMain.handle('self:info', () => ctx?.self) + // 渲染层启动时拉一次当前状态 (补上启动阶段被丢弃的事件) + ipcMain.handle('app:state', () => ({ + ws: collectWsState(), + })) + ipcMain.handle('device:list', () => { const rows = listDevices() const online = new Set(ctx?.discovery.getPeers().map(p => p.deviceId) || []) @@ -974,6 +1031,102 @@ export function registerIpc() { return { path: p, name: basename(p), size: st.size } }) + // ===== 网盘 (浏览对方共享目录 + 选文件下载) ===== + + // 找 peer: 优先用 discovery 的在线列表, 退回 DB 里的历史记录 + function findPeer(peerId: string): DeviceInfo | null { + const p = ctx?.discovery.getPeers().find(x => x.deviceId === peerId) + if (p) return p as DeviceInfo + const d = listDevices().find(x => x.device_id === peerId) as any + if (!d) return null + return { + deviceId: d.device_id, name: d.name, hostname: d.hostname, platform: d.platform, + version: d.version, appVersion: d.app_version, address: d.last_ip || '127.0.0.1', + chatPort: DEFAULT_PORTS.chat, filePort: DEFAULT_PORTS.file, ts: d.last_seen, + driveToken: d.drive_token || undefined, + } as DeviceInfo + } + + ipcMain.handle('drive:list', async (_e, args: { peerId: string; path?: string }) => { + if (!ctx) return { ok: false, reason: 'no ctx' } + const peer = findPeer(args.peerId) + if (!peer) return { ok: false, reason: '找不到该设备' } + return listDrive(peer, args.path || '') + }) + + ipcMain.handle('drive:root', async (_e, args: { peerId: string }) => { + if (!ctx) return { ok: false, reason: 'no ctx' } + const peer = findPeer(args.peerId) + if (!peer) return { ok: false, reason: '找不到该设备' } + return getDriveRoot(peer) + }) + + // 下载选中的文件/目录 (顺序下载, 逐个报进度) + ipcMain.handle('drive:download', async (_e, args: { peerId: string; paths: string[]; destDir?: string }) => { + if (!ctx) return { ok: false, reason: 'no ctx' } + const peer = findPeer(args.peerId) + if (!peer) return { ok: false, reason: '找不到该设备' } + const destDir = args.destDir || ensureDownloadDir() + const results: { relPath: string; ok: boolean; savedPath?: string; size?: number; reason?: string }[] = [] + let index = 0 + const total = (args.paths || []).length + for (const relPath of args.paths || []) { + // 选中的是目录 -> 递归收集里面的文件, 保持层级下载 + const collected = await collectDriveFiles(peer, relPath) + if (!collected.ok) { + results.push({ relPath, ok: false, reason: collected.reason }) + continue + } + // 目录本身也存一份 (下载整目录时, 以目录名作为本地子目录) + const isDir = collected.files.length > 0 && collected.files[0].relPath !== relPath + const baseName = basename(relPath) + for (const f of collected.files) { + // 相对目录的层级 (去掉目录名前缀), 只取目录部分, 文件名由下载时自己拼 + const relInside = isDir ? f.relPath.slice(relPath.length).replace(/^[/\\]+/, '') : '' + const dirInside = relInside ? dirname(relInside) : '' + const destSubPath = isDir ? (dirInside && dirInside !== '.' ? join(baseName, dirInside) : baseName) : undefined + const r = await downloadDriveFile({ + peer, relPath: f.relPath, destDir, + destSubPath: destSubPath || undefined, + onProgress: (sent, totalBytes) => { + broadcastToRenderer('drive:progress', { peerId: args.peerId, relPath: f.relPath, sent, total: totalBytes, index, count: total }) + }, + }) + results.push({ relPath: f.relPath, ok: r.ok, savedPath: r.path, size: r.size, reason: r.reason }) + index++ + } + if (!isDir) index++ + } + const okCount = results.filter(r => r.ok).length + recordAudit({ + action: 'drive.download', target: args.peerId, + result: okCount === results.length && results.length > 0 ? 'ok' : 'error', + payload: { count: results.length, ok: okCount, files: results.map(r => r.relPath) }, + }) + return { ok: true, results } + }) + + // 打开本机网盘目录 + ipcMain.handle('drive:openFolder', async () => { + try { + await shell.openPath(ensureDriveDir()) + return true + } catch { return false } + }) + + // 换网盘根目录 + ipcMain.handle('drive:pickDir', async () => { + const w = BrowserWindow.getFocusedWindow() || BrowserWindow.getAllWindows()[0] + if (!w) return null + const r = await dialog.showOpenDialog(w, { properties: ['openDirectory', 'createDirectory'] }) + if (r.canceled || !r.filePaths[0]) return null + updateSettings({ driveDir: r.filePaths[0] }) + ensureDriveDir() + rebuildMenu() + broadcastToRenderer('settings:changed', getSettings()) + return r.filePaths[0] + }) + // ---- 应用控制 ---- ipcMain.handle('app:hide', () => { const w = BrowserWindow.getAllWindows()[0] @@ -1051,9 +1204,8 @@ export function registerIpc() { ipcMain.handle('forward:close', (_e, args: { sessionId: string }) => { if (!ctx) return false - // 控制端: 关 clientSession - ctx.forward.cleanupClientSession(args.sessionId, 'user') - return true + // 我发起的是 clientSession, 对方发起的是 serverSession —— 两边都得关得掉 + return ctx.forward.closeSession(args.sessionId, 'user') }) ipcMain.handle('forward:listSessions', () => { diff --git a/src/main/paths.ts b/src/main/paths.ts index e118eec..59b3bd1 100644 --- a/src/main/paths.ts +++ b/src/main/paths.ts @@ -30,6 +30,12 @@ export const paths = { if (!existsSync(p)) mkdirSync(p, { recursive: true }) return p })(), + // 默认网盘目录 (对外共享的根目录): ~/Documents/LocalNetMsg/网盘 + defaultDriveDir: (() => { + const p = join(app.getPath('documents'), 'LocalNetMsg', '网盘') + if (!existsSync(p)) mkdirSync(p, { recursive: true }) + return p + })(), } export { isDev } diff --git a/src/main/protocol.ts b/src/main/protocol.ts index 645816a..d58a5bd 100644 --- a/src/main/protocol.ts +++ b/src/main/protocol.ts @@ -23,6 +23,8 @@ export interface DeviceInfo { chatPort: number filePort: number ts: number // 上次心跳时间 + /** 网盘访问令牌 (对端用它调 /drive/* 接口; 没有这个字段 = 老版本, 不支持网盘) */ + driveToken?: string } // ============ WebSocket 协议 ============ diff --git a/src/main/remote/forward.ts b/src/main/remote/forward.ts index 0f054fb..179afff 100644 --- a/src/main/remote/forward.ts +++ b/src/main/remote/forward.ts @@ -276,18 +276,28 @@ export class ForwardManager extends EventEmitter { return true } - cleanupClientSession(sessionId: string, reason = 'user') { + cleanupClientSession(sessionId: string, reason = 'user', notifyPeer = true): boolean { const s = this.clientSessions.get(sessionId) - if (!s) return + if (!s) return false try { s.server?.close() } catch {} try { s.client?.destroy() } catch {} try { s.activeStream?.destroy() } catch {} this.clientSessions.delete(sessionId) - // 通知对方 - const f: CloseF = { type: 'close', sessionId, reason, bytesIn: s.bytesIn, bytesOut: s.bytesOut } - this.chatClient.send({ type: 'forward', payload: f } as WsFrame, s.peerId) + // 通知对方 (收到对方的 close 帧时不用回发) + if (notifyPeer) { + const f: CloseF = { type: 'close', sessionId, reason, bytesIn: s.bytesIn, bytesOut: s.bytesOut } + this.chatClient.send({ type: 'forward', payload: f } as WsFrame, s.peerId) + } this.emit('sessionClosed', { sessionId, peerId: s.peerId, direction: s.direction, reason, bytesIn: s.bytesIn, bytesOut: s.bytesOut, side: 'client' }) recordAudit({ action: 'forward.close', target: s.peerId, sessionId, result: 'closed', bytesIn: s.bytesIn, bytesOut: s.bytesOut, payload: { reason } }) + return true + } + + // UI 的"关闭"按钮: 我发起的是 clientSession, 对方发起的是 serverSession, 两边都要关得掉 + closeSession(sessionId: string, reason = 'user'): boolean { + if (this.clientSessions.has(sessionId)) return this.cleanupClientSession(sessionId, reason) + if (this.serverSessions.has(sessionId)) return this.cleanupServerSession(sessionId, reason) + return false } // UI 列出 (控制端) 全部 session: 包括 self-out (我 server) 和 self-in (我 client) @@ -336,13 +346,13 @@ export class ForwardManager extends EventEmitter { return } case 'close': { - // close 两边都可能收到 (任意一方主动关闭) + // close 两边都可能收到 (任意一方主动关闭) —— 收到的不用再回发 if (this.serverSessions.has(f.sessionId)) { - this.cleanupServerSession(f.sessionId, f.reason || 'closed-by-peer') + this.cleanupServerSession(f.sessionId, f.reason || 'closed-by-peer', false) return } if (this.clientSessions.has(f.sessionId)) { - this.cleanupClientSession(f.sessionId, f.reason || 'closed-by-peer') + this.cleanupClientSession(f.sessionId, f.reason || 'closed-by-peer', false) return } return @@ -509,15 +519,21 @@ export class ForwardManager extends EventEmitter { } } - cleanupServerSession(sessionId: string, reason: string) { + cleanupServerSession(sessionId: string, reason: string, notifyPeer = true): boolean { const sess = this.serverSessions.get(sessionId) - if (!sess) return + if (!sess) return false try { sess.client?.destroy() } catch {} try { sess.server?.close() } catch {} try { sess.activeStream?.destroy() } catch {} this.serverSessions.delete(sessionId) + // 通知对方: 否则对方的 clientSession 还在, 它 bind 的监听端口不会释放 + if (notifyPeer) { + const f: CloseF = { type: 'close', sessionId, reason, bytesIn: sess.bytesIn, bytesOut: sess.bytesOut } + this.chatClient.send({ type: 'forward', payload: f } as WsFrame, sess.peerId) + } this.emit('sessionClosed', { sessionId, peerId: sess.peerId, direction: sess.direction, reason, bytesIn: sess.bytesIn, bytesOut: sess.bytesOut, side: 'server' }) recordAudit({ action: 'forward.close', source: sess.peerId, sessionId, result: 'closed', bytesIn: sess.bytesIn, bytesOut: sess.bytesOut }) + return true } private sendAck(peerId: string, sessionId: string, ok: boolean, reason?: string) { @@ -547,10 +563,10 @@ export class ForwardManager extends EventEmitter { onPeerDisconnected(peerId: string) { for (const [sid, sess] of this.clientSessions) { - if (sess.peerId === peerId) this.cleanupClientSession(sid, 'peer-disconnected') + if (sess.peerId === peerId) this.cleanupClientSession(sid, 'peer-disconnected', false) } for (const [sid, sess] of this.serverSessions) { - if (sess.peerId === peerId) this.cleanupServerSession(sid, 'peer-disconnected') + if (sess.peerId === peerId) this.cleanupServerSession(sid, 'peer-disconnected', false) } } diff --git a/src/main/remote/terminal.ts b/src/main/remote/terminal.ts index dd59729..1ec9dbf 100644 --- a/src/main/remote/terminal.ts +++ b/src/main/remote/terminal.ts @@ -130,8 +130,16 @@ export class TerminalManager extends EventEmitter { // 控制端收到我们的 open 后, ack 给对端 this.emit(`ack:${f.sessionId}`, f.ok, f.reason) return - case 'output': - return // 协议层不应该出现 + case 'output': { + // 控制端: 被控端发来的终端输出 -> 交给渲染层 + // (ipc.ts 监听 TerminalManager 的 'output' 事件, 广播 'remote:terminal:output' 给 UI) + // 之前这里直接 return, 导致控制端永远收不到任何输出 —— 终端窗口一片空白 + if (!f.data) return + const buf = Buffer.from(f.data, 'base64') + if (buf.length === 0) return + this.emit('output', f.sessionId, buf, peer.deviceId) + return + } } } diff --git a/src/main/remote/usb.ts b/src/main/remote/usb.ts index 2809090..b330b04 100644 --- a/src/main/remote/usb.ts +++ b/src/main/remote/usb.ts @@ -126,11 +126,15 @@ export class UsbBridgeManager extends EventEmitter { console.warn('[usb] serialport.list failed:', e?.message) } } - // libusb (用 webusb.getDevices, 不会 claim interface, 安全) + // libusb (只读枚举, 不 claim interface, 安全) if (usbMod) { try { - // 用 webusb.getDevices() 不需要 detach kernel driver, 是只读枚举 - const devices: any[] = await usbMod.webusb.getDevices() + // 注意: node-usb v3 的 webusb.getDevices() 是 WebUSB 语义 —— 只返回"本进程已授权/已打开"的设备, + // 枚举系统上已插着的设备必须用 loadDevices() (内部走 nativeGetDevices) + const webusb: any = usbMod.webusb + const devices: any[] = typeof webusb?.loadDevices === 'function' + ? await webusb.loadDevices() + : await webusb.getDevices() for (const d of devices) { const busId = `usb:${pad4(d.vendorId)}:${pad4(d.productId)}:${d.serialNumber || d.productName || d.productName || '0'}` // 避免和已加的串口重复 (USB-串口适配器在 OS 看来是串口) @@ -299,17 +303,18 @@ export class UsbBridgeManager extends EventEmitter { } // self-in: 我方是 server, 设备在我方 - private async serverAttach(peerId: string, busId: string, kind: 'serial'|'usb'|'usbip', config: UsbAttachConfig): Promise<{ ok: boolean; reason?: string; sessionId?: string }> { + // sessionId: 由发起方决定 —— 对端 attach 请求里带的 id 必须原样沿用, + // 否则 server session 的 key 和控制端的 key 对不上, 数据帧会被当成"无此 session"丢掉 + private async serverAttach(peerId: string, busId: string, kind: 'serial'|'usb'|'usbip', config: UsbAttachConfig, sessionId: string = randomUUID()): Promise<{ ok: boolean; reason?: string; sessionId?: string }> { // 1. 解析 busId 找到本机真实路径/handle const local = await this.listLocal() const dev = local.find(d => d.busId === busId) if (!dev) { - recordAudit({ action: 'usb.attach', target: peerId, sessionId: randomUUID(), result: 'error', payload: { phase: 'no-device', busId, kind } }) + recordAudit({ action: 'usb.attach', target: peerId, sessionId, result: 'error', payload: { phase: 'no-device', busId, kind } }) return { ok: false, reason: '本机找不到该设备' } } // 2. 开设备 - const sessionId = randomUUID() const sess: ServerSession = { sessionId, ownerId: peerId, peerId, busId, kind, bytesIn: 0, bytesOut: 0, @@ -355,12 +360,14 @@ export class UsbBridgeManager extends EventEmitter { const dev2: any = await usbMod.webusb.findDeviceByIds(dev.vid, dev.pid).catch(() => null) if (!dev2) throw new Error('libusb 找不到该设备') await dev2.open() - const configVal = c.configurationValue ?? dev2.configuration?.configurationValue ?? 1 - await dev2.selectConfiguration(configVal) const ifaceNum = c.interfaceNumber ?? 0 + // 顺序很关键: 设备若被内核驱动占着 (HID/uvcvideo/btusb...), 必须先 detach 再 selectConfiguration, + // 否则 selectConfiguration 直接 EBUSY ("device is busy") if (platform === 'linux' && c.detachKernelDriver !== false) { try { await dev2.detachKernelDriver(ifaceNum) } catch {} } + const configVal = c.configurationValue ?? dev2.configuration?.configurationValue ?? 1 + await dev2.selectConfiguration(configVal) await dev2.claimInterface(ifaceNum) sess.usbDev = dev2 sess.usbInterface = ifaceNum @@ -556,8 +563,8 @@ export class UsbBridgeManager extends EventEmitter { if (verdict.remember) markApproved(peer.deviceId, 'usb') } - // 走和 self-in 一样的开设备流程 - const r = await this.serverAttach(peer.deviceId, f.busId, f.config.kind, f.config) + // 走和 self-in 一样的开设备流程 (沿用对端给的 sessionId, 两端 key 必须一致) + const r = await this.serverAttach(peer.deviceId, f.busId, f.config.kind, f.config, f.sessionId) this.sendControl(peer.deviceId, { type: 'attached', sessionId: f.sessionId, ok: r.ok, reason: r.reason, info: r.ok ? this.serverSessions.get(f.sessionId)?.info : undefined }) if (!r.ok) { recordAudit({ action: 'usb.attach', source: peer.deviceId, sessionId: f.sessionId, result: 'error', payload: { phase: 'open', reason: r.reason } }) @@ -578,13 +585,7 @@ export class UsbBridgeManager extends EventEmitter { private async handleCtrlReq(sess: ServerSession, peer: DeviceInfo, f: Extract) { try { const dev = sess.usbDev - const setup: any = { - requestType: f.setup.requestType, - recipient: (f.setup.requestType & 0x1f) as any, // low 5 bits - request: f.setup.request, - value: f.setup.value, - index: f.setup.index, - } + const setup: any = toUsbControlSetup(f.setup) if (f.type === 'ctrlOut') { const data = f.data ? Buffer.from(f.data, 'base64') : null const written = await dev.nativeControlTransferOut(setup, 5000, data ? new Uint8Array(data) : null) @@ -929,6 +930,26 @@ function pad4(n: number): string { return (n || 0).toString(16).padStart(4, '0').toLowerCase() } +// 协议里传的是标准 bmRequestType (bit7 方向 / bit6-5 类型 / bit4-0 recipient), +// 而 node-usb v3 的 control transfer 参数用的是字符串枚举, 这里翻译一下 +export function toUsbControlSetup(setup: { requestType: number; request: number; value: number; index: number }) { + const bm = setup.requestType | 0 + const typeBits = (bm >> 5) & 0x03 + const requestType = typeBits === 1 ? 'class' : typeBits === 2 ? 'vendor' : 'standard' + const rcptBits = bm & 0x1f + const recipient = + rcptBits === 0 ? 'device' : + rcptBits === 1 ? 'interface' : + rcptBits === 2 ? 'endpoint' : 'other' + return { + requestType, + recipient, + request: setup.request | 0, + value: setup.value | 0, + index: setup.index | 0, + } +} + function describeAttach(dir: UsbDirection, config: UsbAttachConfig, busId: string): string { if (config.kind === 'serial') { return dir === 'self-out' diff --git a/src/main/settings.ts b/src/main/settings.ts index 75f634d..431c54b 100644 --- a/src/main/settings.ts +++ b/src/main/settings.ts @@ -26,6 +26,10 @@ export interface Settings { terminalReadOnlyByDefault: boolean /** 审计日志保留天数 */ auditRetentionDays: number + /** 网盘总开关 (关闭后不再对外提供目录浏览/下载) */ + driveEnabled: boolean + /** 网盘根目录 (对外共享的目录, 对端只能看到这个目录里的内容) */ + driveDir: string } export const store = new Store({ @@ -46,6 +50,8 @@ export const store = new Store({ forwardMaxBytesPerSec: 10 * 1024 * 1024, terminalReadOnlyByDefault: false, auditRetentionDays: 30, + driveEnabled: true, + driveDir: paths.defaultDriveDir, }, }) @@ -68,3 +74,13 @@ export function ensureDownloadDir(): string { store.set('downloadDir', dir) return dir } + +// 网盘根目录 (对外共享). 保证存在, 并把设置里的值同步成真实路径 +export function ensureDriveDir(): string { + const dir = store.get('driveDir') || paths.defaultDriveDir + if (!existsSync(dir)) { + mkdirSync(dir, { recursive: true }) + } + store.set('driveDir', dir) + return dir +} diff --git a/src/main/ws-state.ts b/src/main/ws-state.ts new file mode 100644 index 0000000..dc70cb8 --- /dev/null +++ b/src/main/ws-state.ts @@ -0,0 +1,31 @@ +// 消息通道状态计算 (纯逻辑, 不依赖 electron, 便于自测) +// +// 通道 = outgoing WS (我们主动连过去的) 或 inbound WS (对方连过来的), 任何一条活的就说明消息能通。 +// 之前 UI 只盯着 outgoing, 结果对方只连进来、我们没连上时, 会误报"等待重连"。 + +export type WsClientStatus = Record + +export interface WsStateServer { + isConnected: (deviceId: string) => boolean +} + +/** + * 算出各对端的通道是否可用。 + * @param peerIds 已知对端 (比如 discovery 报到的) + * @param clientStatus chat-client 里各对端的 outgoing 状态 + * @param server chat-server, 用来查 inbound 连接 + */ +export function computeWsState( + peerIds: string[], + clientStatus: WsClientStatus, + server: WsStateServer, +): Record { + const out: Record = {} + const alive = (id: string) => clientStatus[id] === 'open' || server.isConnected(id) + for (const id of peerIds) out[id] = alive(id) + // 没有出现在 peer 列表、但已有连接记录的, 也补上 + for (const id of Object.keys(clientStatus)) { + if (!(id in out)) out[id] = alive(id) + } + return out +} diff --git a/src/preload/index.ts b/src/preload/index.ts index 35a77b0..b2dbfee 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -8,6 +8,8 @@ contextBridge.exposeInMainWorld('api', { // self / 设备 self: () => ipcRenderer.invoke('self:info'), listDevices: () => ipcRenderer.invoke('device:list'), + // 启动时拉一次主进程当前状态 (WS 通道等) — 补上订阅前丢失的事件 + appState: () => ipcRenderer.invoke('app:state'), triggerScan: () => ipcRenderer.invoke('device:triggerScan'), deleteDevice: (deviceId: string) => ipcRenderer.invoke('device:delete', deviceId), @@ -104,6 +106,13 @@ contextBridge.exposeInMainWorld('api', { usbDetach: (sessionId: string) => ipcRenderer.invoke('usb:detach', { sessionId }), usbListSessions: () => ipcRenderer.invoke('usb:listSessions'), + // 网盘: 浏览对方共享目录 + 选文件下载 + driveList: (peerId: string, path?: string) => ipcRenderer.invoke('drive:list', { peerId, path: path || '' }), + driveRoot: (peerId: string) => ipcRenderer.invoke('drive:root', { peerId }), + driveDownload: (peerId: string, paths: string[]) => ipcRenderer.invoke('drive:download', { peerId, paths }), + driveOpenFolder: () => ipcRenderer.invoke('drive:openFolder'), + drivePickDir: () => ipcRenderer.invoke('drive:pickDir'), + // 授权 / 审计 remoteApprovalList: () => ipcRenderer.invoke('remote:approval:list'), remoteApprovalReply: (requestId: string, ok: boolean, remember?: boolean) => diff --git a/src/renderer/src/App.vue b/src/renderer/src/App.vue index c84a980..0b72cd9 100644 --- a/src/renderer/src/App.vue +++ b/src/renderer/src/App.vue @@ -38,14 +38,25 @@ function showToast(text: string) { const unsubs: Array<() => void> = [] -onMounted(async () => { - await device.loadSelf() - if (device.self) message.setSelf(device.self.deviceId) - await device.refresh() - // 启动后尝试一次 flush pending - setTimeout(() => { window.api.flushPending() }, 1500) +// 应用 WS 通道状态快照 +// 通道活着 = 对方直接可达, 顺带把"在线"状态拉回来 (discovery 心跳断了但通道还在的情况) +function applyWsState(ws: Record | undefined) { + const map = ws || {} + device.setWsStates(map) + for (const [id, alive] of Object.entries(map)) { + if (!alive) continue + const d = device.devices.find(x => x.deviceId === id) + if (d && !d.online) d.online = true + } +} - unsubs.push(window.api.on('boot:ready', () => { device.refresh() })) +onMounted(async () => { + // 监听器必须先注册再做任何 await —— 这期间主进程推来的事件会被整条丢掉 + // (启动时主进程往往已经连上对端, 渲染层订阅晚一步就永远收不到那条状态, UI 会卡在"等待重连") + unsubs.push(window.api.on('boot:ready', async (st: { ws?: Record }) => { + await device.refresh() + if (st?.ws) applyWsState(st.ws) + })) unsubs.push(window.api.on('device:found', (d: DeviceView) => { const idx = device.devices.findIndex(x => x.deviceId === d.deviceId) const merged: DeviceView = { ...(device.devices[idx] || ({} as DeviceView)), ...d, online: true, lastSeen: Date.now() } @@ -57,6 +68,8 @@ onMounted(async () => { if (idx >= 0) device.devices[idx] = { ...device.devices[idx], ...d, online: true, lastSeen: Date.now() } })) unsubs.push(window.api.on('device:lost', ({ deviceId }: { deviceId: string }) => { + // UDP 心跳断了, 但消息通道可能还活着 (对端直接连着我们) —— 那就不算离线 + if (device.channelAlive(deviceId)) return const d = device.devices.find(x => x.deviceId === deviceId) if (d) d.online = false })) @@ -65,12 +78,14 @@ onMounted(async () => { if (d) d.online = true })) unsubs.push(window.api.on('device:offline', ({ deviceId }: { deviceId: string }) => { + // 入站连接断了, outgoing 可能还通 —— 通道活着就不算离线 + if (device.channelAlive(deviceId)) return const d = device.devices.find(x => x.deviceId === deviceId) if (d) d.online = false })) - // 我们 outgoing WS 接通/断开 — 让 chat header 能区分 "discovery 在线" 和 "WS 在线" - unsubs.push(window.api.on('device:wsState', ({ deviceId, wsOpen }: { deviceId: string; wsOpen: boolean }) => { - device.setWsOpen(deviceId, wsOpen) + // 消息通道状态 (全量快照) — 让 chat header 能区分 "discovery 在线" 和 "通道可用" + unsubs.push(window.api.on('device:wsState', ({ ws }: { ws: Record }) => { + applyWsState(ws) })) unsubs.push(window.api.on('message:received', (env: MessageView) => { const fromId = env.fromDeviceId @@ -157,12 +172,24 @@ onMounted(async () => { unsubs.push(window.api.on('remote:terminal:closed', (p) => terminal.onClosed(p))) unsubs.push(window.api.on('remote:forward:opened', (p) => forward.onOpened(p))) unsubs.push(window.api.on('remote:forward:closed', (p) => forward.onClosed(p))) - unsubs.push(window.api.on('remote:usb:opened', () => { /* no-op; refresh in component */ })) + unsubs.push(window.api.on('remote:usb:opened', (p) => usb.onOpened(p))) unsubs.push(window.api.on('remote:usb:closed', (p) => usb.onClosed(p))) unsubs.push(window.api.on('remote:usb:output', (p) => usb.onOutput(p))) unsubs.push(window.api.on('remote:usb:error', (p) => { /* surface via console for now */ console.warn('[usb]', p) })) unsubs.push(window.api.on('remote:approval:requested', (req) => approval.add(req))) + // ---- 初始状态拉取 (监听器已就位, 这里只补数据) ---- + await device.loadSelf() + if (device.self) message.setSelf(device.self.deviceId) + await device.refresh() + // 拉一次主进程当前快照: 补上订阅之前发生、永远不会被重放的 WS 连接事件 + try { + const st = await window.api.appState() + applyWsState(st?.ws) + } catch { /* 主进程还没起来就算了, 后续事件会覆盖 */ } + // 启动后尝试一次 flush pending + setTimeout(() => { window.api.flushPending() }, 1500) + // 启动时拉取当前 approval 队列 (防止刚启动就出现未读请求) approval.refresh().catch(() => {}) }) diff --git a/src/renderer/src/api.ts b/src/renderer/src/api.ts index 4bb2248..70d6e44 100644 --- a/src/renderer/src/api.ts +++ b/src/renderer/src/api.ts @@ -7,6 +7,8 @@ export type LnmApiBase = { self: () => Promise listDevices: () => Promise + // 主进程当前状态快照 (ws = 各设备的消息通道是否可用) + appState: () => Promise triggerScan: () => Promise deleteDevice: (deviceId: string) => Promise<{ ok: boolean; reason?: string }> @@ -68,6 +70,12 @@ export interface DeviceView { lastSeen: number } +// 主进程状态快照 +export interface AppStateView { + // deviceId -> 消息通道是否可用 (outgoing 或 inbound 任一 WS 活着即为 true) + ws: Record +} + export type MessageType = 'text' | 'image' | 'file' | 'system' export interface MessageView { @@ -95,6 +103,8 @@ export interface Settings { forwardMaxBytesPerSec?: number terminalReadOnlyByDefault?: boolean auditRetentionDays?: number + driveEnabled?: boolean + driveDir?: string } export interface NetInterface { @@ -255,6 +265,23 @@ export interface AuditEntry { bytes_out: number } +// 远程: 网盘 (浏览对方共享目录 + 选文件下载) +export interface DriveEntry { + name: string + path: string // 相对对方网盘根目录的路径 + size: number + mtime: number + isDir: boolean +} + +export interface DriveListResult { + ok: boolean + reason?: string + path?: string + entries?: DriveEntry[] + root?: string +} + // 扩展 API export type LnmApiExtra = { terminalOpen: (peerId: string, opts?: { rows?: number; cols?: number; readOnly?: boolean }) => @@ -288,6 +315,17 @@ export type LnmApiExtra = { usbDetach: (sessionId: string) => Promise<{ ok: boolean; reason?: string }> usbListSessions: () => Promise<{ client: UsbSessionInfo[]; server: UsbSessionInfo[] }> + // 网盘 + driveList: (peerId: string, path?: string) => Promise + driveRoot: (peerId: string) => Promise<{ ok: boolean; dir?: string; reason?: string }> + driveDownload: (peerId: string, paths: string[]) => Promise<{ + ok: boolean + reason?: string + results?: { relPath: string; ok: boolean; savedPath?: string; size?: number; reason?: string }[] + }> + driveOpenFolder: () => Promise + drivePickDir: () => Promise + remoteApprovalList: () => Promise remoteApprovalReply: (requestId: string, ok: boolean, remember?: boolean) => Promise auditList: (args?: { limit?: number; since?: number; sessionId?: string }) => Promise diff --git a/src/renderer/src/components/ChatView.vue b/src/renderer/src/components/ChatView.vue index cd1578e..6db9b7d 100644 --- a/src/renderer/src/components/ChatView.vue +++ b/src/renderer/src/components/ChatView.vue @@ -8,10 +8,11 @@ import MessageInput from './MessageInput.vue' import TerminalPanel from './remote/TerminalPanel.vue' import ForwardPanel from './remote/ForwardPanel.vue' import UsbPanel from './remote/UsbPanel.vue' +import DrivePanel from './remote/DrivePanel.vue' import type { DeviceView } from '@/api' import { initialsOf, colorFor, formatTime } from '@/utils/format' import { ElAvatar, ElButton, ElEmpty, ElIcon, ElScrollbar, ElMessage } from 'element-plus' -import { ChatLineRound, Promotion, UploadFilled, Position, Connection, Cellphone } from '@element-plus/icons-vue' +import { ChatLineRound, Promotion, UploadFilled, Position, Connection, Cellphone, FolderOpened } from '@element-plus/icons-vue' const props = defineProps<{ peer: DeviceView | null }>() const emit = defineEmits<{ (e: 'open-image', url: string): void }>() @@ -20,7 +21,7 @@ const device = useDeviceStore() const message = useMessageStore() const session = useSessionStore() -type Tab = 'chat' | 'terminal' | 'forward' | 'usb' +type Tab = 'chat' | 'terminal' | 'forward' | 'usb' | 'drive' const activeTab = ref('chat') // 切到别的设备时回到 chat tab watch(() => session.activePeerId, () => { activeTab.value = 'chat' }) @@ -28,12 +29,11 @@ watch(() => session.activePeerId, () => { activeTab.value = 'chat' }) const self = computed(() => device.self) const messages = computed(() => session.activePeerId ? (message.byPeer[session.activePeerId] || []) : []) const typingPeer = computed(() => session.activePeerId ? session.peerTyping[session.activePeerId] : false) -// 我方 outgoing WS 是否连通 — 严格默认 false (从没收到过 device:wsState 时, -// 显示 "等待重连" 而不是骗用户 "在线"; 看到首次 open 事件后才会变成 true) -const wsOpen = computed(() => { +// 消息通道是否可用: outgoing 或 inbound 任一 WS 活着就算通 (主进程给的是全量快照) +// 拿不到状态时按 false 处理 (显示"连接中"), 不猜"在线" +const channelAlive = computed(() => { if (!props.peer) return false - const v = device.wsOpen[props.peer.deviceId] - return v === undefined ? false : v + return device.wsOpen[props.peer.deviceId] === true }) const bodyEl = ref<{ scrollTo: (opts: { top: number }) => void } | null>(null) @@ -140,16 +140,16 @@ async function onGlobalDrop(e: DragEvent) {