Files
2026-05-16 13:24:02 +08:00

319 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 开发指南
<cite>
**本文引用的文件**
- [package.json](file://package.json)
- [client/package.json](file://client/package.json)
- [tsconfig.json](file://tsconfig.json)
- [tsconfig.lint.json](file://tsconfig.lint.json)
- [jest.config.js](file://jest.config.js)
- [client/jest.config.js](file://client/jest.config.js)
- [client/jest.setup.js](file://client/jest.setup.js)
- [.eslintrc.cjs](file://.eslintrc.cjs)
- [client/.eslintrc.json](file://client/.eslintrc.json)
- [.editorconfig](file://.editorconfig)
- [run.bat](file://run.bat)
- [.gitignore](file://.gitignore)
- [src/index.ts](file://src/index.ts)
- [src/server.ts](file://src/server.ts)
- [src/class/options.ts](file://src/class/options.ts)
- [src/log.ts](file://src/log.ts)
- [test/httphandler.test.ts](file://test/httphandler.test.ts)
- [test/websockethandler.test.ts](file://test/websockethandler.test.ts)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本开发指南面向参与“视频流服务器”项目的开发者,目标是帮助你快速搭建本地开发环境、理解代码规范与编码标准、掌握调试与测试技巧、明确扩展开发流程、以及建立版本管理与发布流程的共识。项目采用 Node.js + TypeScript 构建,前端静态资源由服务端托管,支持 WebSocket 与 HTTP 两种信令模式,内置日志系统与 Swagger 文档。
## 项目结构
项目分为服务端与客户端两部分:
- 服务端srcExpress 应用、HTTP 路由、WebSocket 信令、日志与配置等。
- 客户端client静态页面与前端脚本通过 /module 与 /uploads 等路由访问。
```mermaid
graph TB
subgraph "服务端(src)"
IDX["入口: index.ts"]
SRV["HTTP服务: server.ts"]
LOG["日志: log.ts"]
OPT["选项: class/options.ts"]
end
subgraph "客户端(client)"
PUB["静态资源: public/*"]
SRC["前端源码: src/*"]
end
IDX --> SRV
SRV --> PUB
SRV --> SRC
SRV --> LOG
IDX --> OPT
```
图表来源
- [src/index.ts:1-109](file://src/index.ts#L1-L109)
- [src/server.ts:1-90](file://src/server.ts#L1-L90)
- [src/class/options.ts:1-10](file://src/class/options.ts#L1-L10)
- [src/log.ts:1-51](file://src/log.ts#L1-L51)
章节来源
- [src/index.ts:1-109](file://src/index.ts#L1-L109)
- [src/server.ts:1-90](file://src/server.ts#L1-L90)
## 核心组件
- 入口与启动命令行参数解析、HTTPS/HTTP 启动、信令类型选择、日志输出。
- HTTP 服务CORS、JSON/URL 编码中间件、静态资源、Swagger 文档、头像上传接口。
- 日志系统:可配置的日志级别与格式化输出。
- 测试框架Jest服务端、Jest + jsdom客户端覆盖 HTTP 与 WebSocket 信令逻辑。
章节来源
- [src/index.ts:1-109](file://src/index.ts#L1-L109)
- [src/server.ts:1-90](file://src/server.ts#L1-L90)
- [src/log.ts:1-51](file://src/log.ts#L1-L51)
- [jest.config.js:1-196](file://jest.config.js#L1-L196)
- [client/jest.config.js:1-196](file://client/jest.config.js#L1-L196)
## 架构总览
下图展示从浏览器到服务端的典型请求链路,包括静态资源、信令与上传接口。
```mermaid
sequenceDiagram
participant Browser as "浏览器"
participant Express as "Express 应用(server.ts)"
participant Signaling as "信令(HTTP/WebSocket)"
participant FS as "文件系统(头像上传)"
Browser->>Express : GET /
Express-->>Browser : 返回首页(静态资源)
Browser->>Express : GET /config
Express-->>Browser : 返回运行配置
Browser->>Express : GET /signaling/*
Express->>Signaling : 转发至 HTTP 信令处理器
Browser->>Express : POST /api/upload/avatar
Express->>FS : 写入头像并重命名
FS-->>Express : 返回结果
Express-->>Browser : JSON 响应
```
图表来源
- [src/server.ts:25-87](file://src/server.ts#L25-L87)
- [src/index.ts:75-90](file://src/index.ts#L75-L90)
章节来源
- [src/server.ts:1-90](file://src/server.ts#L1-L90)
- [src/index.ts:1-109](file://src/index.ts#L1-L109)
## 详细组件分析
### 启动与配置index.ts
- 支持命令行参数端口、HTTPS 证书、信令类型、通信模式、日志级别。
- 自动检测本机 IPv4 地址并输出访问地址。
- 根据信令类型启动 HTTP 轮询或 WebSocket 信令服务。
```mermaid
flowchart TD
Start(["进程启动"]) --> ParseArgs["解析命令行参数"]
ParseArgs --> CreateApp["创建 Express 应用"]
CreateApp --> Mode{"是否启用 HTTPS?"}
Mode --> |是| HTTPS["读取密钥与证书并监听"]
Mode --> |否| HTTP["以 HTTP 监听"]
HTTPS --> DetectIP["检测本机 IPv4 地址"]
HTTP --> DetectIP
DetectIP --> SigType{"信令类型"}
SigType --> |websocket| WS["初始化 WebSocket 信令"]
SigType --> |http| HTTPSig["初始化 HTTP 轮询信令"]
WS --> Done(["完成"])
HTTPSig --> Done
```
图表来源
- [src/index.ts:14-105](file://src/index.ts#L14-L105)
章节来源
- [src/index.ts:1-109](file://src/index.ts#L1-L109)
- [src/class/options.ts:1-10](file://src/class/options.ts#L1-L10)
### HTTP 服务与静态资源server.ts
- 中间件CORS、JSON、URL 编码、日志Morgan
- 路由:
- GET /config返回运行配置信令类型、模式、日志级别
- /signaling转发至信令模块。
- 静态资源:/ 与 /module。
- 上传接口POST /api/upload/avatar使用 Multer 存储并按用户 ID 重命名。
- /uploads公开头像目录。
```mermaid
flowchart TD
Req["请求进入"] --> CORS["CORS 允许所有来源"]
CORS --> Body["解析 JSON/URL 编码"]
Body --> Log{"日志级别允许?"}
Log --> |是| Morgan["Morgan 访问日志"]
Log --> |否| Skip["跳过日志"]
Morgan --> Routes["分发路由"]
Skip --> Routes
Routes --> Config["GET /config"]
Routes --> Signaling["GET/POST /signaling/*"]
Routes --> Static["静态资源: / 与 /module"]
Routes --> Upload["POST /api/upload/avatar"]
Routes --> PublicUploads["GET /uploads/*"]
```
图表来源
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
章节来源
- [src/server.ts:1-90](file://src/server.ts#L1-L90)
### 日志系统log.ts
- 提供多级日志none/error/warn/log/info。
- 可通过字符串解析日志级别。
- 输出包含时间戳与级别前缀。
章节来源
- [src/log.ts:1-51](file://src/log.ts#L1-L51)
### 测试与断言Jest
- 服务端测试:覆盖 HTTP 信令在 public/private 模式下的行为,含超时清理逻辑。
- 客户端测试Jest + jsdom 环境,通过 setup 注入 fetch、TextEncoder/Decoder、RTCPeerConnection 等缺失对象。
章节来源
- [test/httphandler.test.ts:1-510](file://test/httphandler.test.ts#L1-L510)
- [test/websockethandler.test.ts:1-191](file://test/websockethandler.test.ts#L1-L191)
- [client/jest.setup.js:1-35](file://client/jest.setup.js#L1-L35)
## 依赖关系分析
- 语言与构建TypeScript、ts-node、Jest、ESLint。
- Web 框架Express、wsWebSocket、Multer文件上传
- 文档Swagger JSdoc、Swagger UI Express。
- 日志Morgan。
- 工具Commander命令行解析
```mermaid
graph LR
Pkg["package.json 依赖"] --> TS["TypeScript 运行时"]
Pkg --> Express["Express"]
Pkg --> WS["ws"]
Pkg --> Mul["Multer"]
Pkg --> Swagger["Swagger UI Express"]
Pkg --> Morgan["Morgan"]
Pkg --> Cmdr["Commander"]
Pkg --> Jest["Jest"]
Pkg --> ESL["ESLint + TS 插件"]
```
图表来源
- [package.json:14-46](file://package.json#L14-L46)
章节来源
- [package.json:1-60](file://package.json#L1-L60)
## 性能考虑
- 上传路径:头像上传使用磁盘存储,建议在生产环境挂载独立持久卷并限制文件大小与类型。
- 日志级别:默认 info可在高并发场景调低日志级别以减少 I/O。
- 静态资源Express 静态托管适合开发,生产建议使用 CDN 或反向代理缓存。
- 信令WebSocket 在高并发下优于 HTTP 轮询,建议优先使用 websocket 模式。
## 故障排查指南
- 启动失败HTTPS 证书):确认 server.key 与 server.cert 存在且可读;或禁用 HTTPS 并使用 HTTP。
- 无法访问 /uploads确保 uploads 目录存在且可读写。
- 上传失败:检查 Multer 配置与权限,查看服务端错误日志。
- 测试失败jsdom 缺失 API确保使用客户端 jest.config 的 setup 文件已加载。
- 超时会话未清理:检查 HTTP 信令测试中的超时轮询逻辑与清理触发点。
章节来源
- [src/server.ts:44-87](file://src/server.ts#L44-L87)
- [client/jest.setup.js:1-35](file://client/jest.setup.js#L1-L35)
- [test/httphandler.test.ts:194-309](file://test/httphandler.test.ts#L194-L309)
## 结论
本项目提供了清晰的服务端架构与完善的测试体系,支持 WebSocket 与 HTTP 两种信令模式,并内置日志与文档能力。遵循本文的开发与测试规范,可高效地进行功能扩展与维护。
## 附录
### 开发环境搭建步骤
- 安装 Node.js 与 npm建议使用版本管理器以避免版本冲突
- 克隆仓库后,在根目录与 client 目录分别执行安装依赖命令。
- 准备 HTTPS 证书(可选):若启用 HTTPS需准备 server.key 与 server.cert。
- 使用提供的脚本启动开发服务或打包产物。
章节来源
- [package.json:5-12](file://package.json#L5-L12)
- [client/package.json:5-8](file://client/package.json#L5-L8)
- [run.bat:1-17](file://run.bat#L1-L17)
### 代码规范与编码标准
- 统一缩进与换行EditorConfig 规定空格缩进、LF 换行、UTF-8 字符集。
- TypeScript 规范ESLint 配置启用 @typescript-eslint 推荐规则,强制分号。
- JavaScript 规范客户端ESLint 配置启用 jest 插件与推荐规则,强制分号。
- 代码风格:遵循 EditorConfig 与 ESLint 规则,保持一致的排版与语法。
章节来源
- [.editorconfig:10-20](file://.editorconfig#L10-L20)
- [.eslintrc.cjs:1-25](file://.eslintrc.cjs#L1-L25)
- [client/.eslintrc.json:1-23](file://client/.eslintrc.json#L1-L23)
### 调试技巧与开发工具
- 本地启动:使用开发脚本启动服务,自动监听 TypeScript 源码变化。
- 单元测试:使用 Jest 运行服务端与客户端测试,关注覆盖率与断言。
- 信令调试:根据运行日志确认信令类型与模式,必要时降低日志级别以便观察。
- 上传调试:通过 /uploads 访问上传后的头像,验证重命名与路径。
章节来源
- [package.json:5-12](file://package.json#L5-L12)
- [jest.config.js:1-196](file://jest.config.js#L1-L196)
- [client/jest.config.js:1-196](file://client/jest.config.js#L1-L196)
- [src/server.ts:62-87](file://src/server.ts#L62-L87)
### 扩展开发机制
- 新增 HTTP 路由:在 server.ts 中添加路由与处理逻辑,注意中间件顺序与错误处理。
- 新增 WebSocket 事件:在 WebSocket 信令模块中新增事件处理函数,并在测试中补充断言。
- 新增测试用例:在 test 目录下新增对应测试文件,复用现有的公共断言与模拟数据。
- 修改现有功能:遵循最小变更原则,先写测试,再实现修复或增强。
章节来源
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [test/httphandler.test.ts:1-510](file://test/httphandler.test.ts#L1-L510)
- [test/websockethandler.test.ts:1-191](file://test/websockethandler.test.ts#L1-L191)
### 版本管理、分支策略与发布流程
- 版本号项目使用语义化版本package.json 中 version 字段)。
- 分支策略:建议采用 Git Flow主分支用于稳定版本开发分支用于迭代。
- 发布流程本地构建build、测试test、打包pack生成可执行包或容器镜像后发布。
章节来源
- [package.json:2-4](file://package.json#L2-L4)
- [package.json:5-12](file://package.json#L5-L12)
### 贡献指南与代码审查标准
- 提交前:运行 lint 与 test确保通过。
- 提交流程:提交变更到功能分支,发起 Pull Request至少一名维护者审查。
- 代码审查要点:功能正确性、边界条件、错误处理、日志与安全、测试覆盖、性能影响。
章节来源
- [package.json:11-12](file://package.json#L11-L12)
- [jest.config.js:1-196](file://jest.config.js#L1-L196)
- [client/jest.config.js:1-196](file://client/jest.config.js#L1-L196)
### 常见问题与最佳实践
- 问题:浏览器跨域访问受限
- 解决:服务端已启用 CORS确保请求头与路径正确。
- 问题WebSocket 连接失败
- 解决:确认信令类型为 websocket检查服务端日志与防火墙设置。
- 问题:头像上传失败
- 解决:确认上传目录存在且可写,检查文件类型与大小限制。
- 最佳实践:在生产环境使用 HTTPS、CDN 加速静态资源、合理设置日志级别与轮询间隔。
章节来源
- [src/server.ts:22-24](file://src/server.ts#L22-L24)
- [src/server.ts:44-87](file://src/server.ts#L44-L87)
- [src/index.ts:55-74](file://src/index.ts#L55-L74)