a79086e4e8762f7ffaf99df50e16cd4f9d120138
新增网盘功能 - 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
LocalNetMsg
局域网即时通讯工具,飞书/微信聊天风格。基于 Electron + Vue 3 + TypeScript。
功能
- 局域网自动发现 (UDP 广播)
- 1 对 1 私聊,消息持久化 (SQLite)
- 富文本消息:Markdown / 代码高亮 / @提醒 / 表情
- 图片消息:粘贴板、拖拽、本地选择
- 文件传输:任意类型,大文件流式上传
- 飞书式三栏 UI,消息气泡、时间分组、发送状态
- 系统托盘最小化,后台新消息系统级通知
- 接收文件按
设置目录/YYYY-MM/自动归档
开发
环境要求: Node.js >= 20
npm install
npm run dev # 启动 Electron + 热更新
第一次启动时:
- 默认接收目录:
~/Documents/LocalNetMsg - 默认设备名: 操作系统主机名
- 两个端口自动分配 (UDP 发现 47800 / WebSocket 47900 / 文件 47901)
要测试多设备,在同一局域网的不同机器上各跑一个实例即可。
项目结构
src/
├── main/ Electron 主进程
│ ├── index.ts 入口: 窗口、托盘、IPC
│ ├── discovery.ts UDP 局域网发现
│ ├── chat-server WebSocket 服务端
│ ├── chat-client WebSocket 客户端
│ ├── file-server HTTP 文件服务
│ ├── db.ts SQLite 持久化
│ ├── settings.ts electron-store
│ ├── notify.ts 系统通知
│ └── protocol.ts 消息协议定义
├── preload/ contextBridge 桥接
└── renderer/ Vue 3 渲染层
├── src/
│ ├── views/ ChatView, SettingsView
│ ├── components/ Sidebar, MessageList, MessageItem, MessageInput
│ ├── stores/ Pinia
│ ├── api/ IPC 桥接
│ └── utils/ markdown, format
└── index.html
配置
~/AppData/Roaming/local-net-msg/config.json (electron-store):
deviceName: 本机在网络中的显示名downloadDir: 接收文件保存目录notifications: 是否启用系统通知
端口
| 用途 | 端口 | 协议 |
|---|---|---|
| 局域网发现 | 47800 | UDP |
| 聊天 | 47900 | WebSocket |
| 文件传输 | 47901 | HTTP |
被占用时自动顺延。
Description
Languages
TypeScript
70.8%
Vue
23.6%
JavaScript
5.3%
CSS
0.2%