# 贡献指南 **本文引用的文件** - [package.json](file://package.json) - [tsconfig.json](file://tsconfig.json) - [.eslintrc.cjs](file://.eslintrc.cjs) - [jest.config.js](file://jest.config.js) - [src/index.ts](file://src/index.ts) - [src/server.ts](file://src/server.ts) - [src/class/websockethandler.ts](file://src/class/websockethandler.ts) - [src/class/httphandler.ts](file://src/class/httphandler.ts) - [.gitignore](file://.gitignore) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本贡献指南面向希望参与“视频流服务器”项目的开发者,提供从 Fork、Clone、分支与提交、Pull Request 到代码审查、Issue 提交、版本发布与变更日志维护、社区行为准则与协作规范的全流程说明。同时给出新贡献者的入门建议与资源链接,帮助快速上手。 ## 项目结构 该项目采用前后端一体化的 Node/Express + TypeScript 后端,内置静态前端资源与测试框架,支持 WebSocket 与 HTTP 两种信令模式,具备会话管理、WebRTC 信令转发、文件上传与 Swagger 文档能力。 ```mermaid graph TB subgraph "后端" IDX["入口: src/index.ts"] SRV["服务器: src/server.ts"] WS["WebSocket处理器: src/class/websockethandler.ts"] HTTP["HTTP处理器: src/class/httphandler.ts"] end subgraph "前端" PUB["静态资源: client/public/**/*"] SRC["前端模块: client/src/**/*"] end subgraph "工具与配置" PKG["包脚本: package.json"] TSC["编译配置: tsconfig.json"] ESL["代码规范: .eslintrc.cjs"] JST["测试配置: jest.config.js"] GIT["忽略规则: .gitignore"] end IDX --> SRV SRV --> WS SRV --> HTTP SRV --> PUB SRV --> SRC PKG --> TSC PKG --> ESL PKG --> JST PKG --> GIT ``` **图表来源** - [src/index.ts:1-109](file://src/index.ts#L1-L109) - [src/server.ts:1-90](file://src/server.ts#L1-L90) - [src/class/websockethandler.ts:1-479](file://src/class/websockethandler.ts#L1-L479) - [src/class/httphandler.ts:1-800](file://src/class/httphandler.ts#L1-L800) - [package.json:1-60](file://package.json#L1-L60) - [tsconfig.json:1-13](file://tsconfig.json#L1-L13) - [.eslintrc.cjs:1-25](file://.eslintrc.cjs#L1-L25) - [jest.config.js:1-196](file://jest.config.js#L1-L196) - [.gitignore:1-187](file://.gitignore#L1-L187) **章节来源** - [src/index.ts:1-109](file://src/index.ts#L1-L109) - [src/server.ts:1-90](file://src/server.ts#L1-L90) - [package.json:1-60](file://package.json#L1-L60) - [tsconfig.json:1-13](file://tsconfig.json#L1-L13) - [.eslintrc.cjs:1-25](file://.eslintrc.cjs#L1-L25) - [jest.config.js:1-196](file://jest.config.js#L1-L196) - [.gitignore:1-187](file://.gitignore#L1-L187) ## 核心组件 - 入口与启动 - 通过命令行参数解析与 HTTPS/HTTP 服务启动,支持 WebSocket 或 HTTP 信令模式,以及公共/私有通信模式。 - 服务器与路由 - Express 应用挂载 CORS、日志中间件、静态资源、Swagger 文档、上传接口与信令路由。 - WebSocket 信令 - 实现 1 对多(主持人/参与者)模式下的 offer/answer/candidate 转发、广播、心跳检测与断线清理。 - HTTP 信令 - 基于轮询的信令 API,提供会话创建、连接管理、offer/answer/candidate 获取与断线记录。 - 测试与规范 - Jest 测试配置与覆盖率收集;ESLint TypeScript 规则;TypeScript 编译配置。 **章节来源** - [src/index.ts:1-109](file://src/index.ts#L1-L109) - [src/server.ts:1-90](file://src/server.ts#L1-L90) - [src/class/websockethandler.ts:1-479](file://src/class/websockethandler.ts#L1-L479) - [src/class/httphandler.ts:1-800](file://src/class/httphandler.ts#L1-L800) - [jest.config.js:1-196](file://jest.config.js#L1-L196) - [.eslintrc.cjs:1-25](file://.eslintrc.cjs#L1-L25) - [tsconfig.json:1-13](file://tsconfig.json#L1-L13) ## 架构总览 后端以 Express 为核心,根据信令类型选择 WebSocket 或 HTTP 处理器;静态资源与前端模块通过 Express 提供;测试与规范工具贯穿开发流程。 ```mermaid graph TB Client["浏览器/客户端"] --> Mode{"信令模式"} Mode --> |WebSocket| WS["WebSocket处理器
websockethandler.ts"] Mode --> |HTTP| HTTP["HTTP处理器
httphandler.ts"] WS --> Server["Express服务器
server.ts"] HTTP --> Server Server --> Static["静态资源
client/public/**/*"] Server --> Front["前端模块
client/src/**/*"] Server --> Swagger["Swagger文档"] Server --> Upload["头像上传API"] ``` **图表来源** - [src/server.ts:1-90](file://src/server.ts#L1-L90) - [src/class/websockethandler.ts:1-479](file://src/class/websockethandler.ts#L1-L479) - [src/class/httphandler.ts:1-800](file://src/class/httphandler.ts#L1-L800) ## 详细组件分析 ### WebSocket 信令处理流程 WebSocket 处理器支持公共/私有模式,实现连接、断开、offer/answer/candidate 转发与广播、心跳检测与断线清理。 ```mermaid sequenceDiagram participant C as "客户端" participant S as "WebSocket处理器" participant G as "连接组" participant H as "主持人" participant P as "参与者" C->>S : "connect(connectionId)" S->>G : "创建/加入连接组" S-->>C : "connect(角色, participantId)" C->>S : "offer/answer/candidate" alt 私有模式 S->>H : "主持人接收转发" S->>P : "参与者接收转发" else 公共模式 S->>G : "广播到其他客户端" end C->>S : "disconnect" S->>G : "清理连接组并通知" S-->>C : "disconnect" ``` **图表来源** - [src/class/websockethandler.ts:145-206](file://src/class/websockethandler.ts#L145-L206) - [src/class/websockethandler.ts:214-338](file://src/class/websockethandler.ts#L214-L338) - [src/class/websockethandler.ts:448-473](file://src/class/websockethandler.ts#L448-L473) **章节来源** - [src/class/websockethandler.ts:1-479](file://src/class/websockethandler.ts#L1-L479) ### HTTP 信令处理流程 HTTP 处理器提供会话与连接管理、offer/answer/candidate 获取、断线记录与全量信令拉取。 ```mermaid sequenceDiagram participant Client as "客户端" participant Handler as "HTTP处理器" participant Store as "内存存储" participant Other as "其他会话/连接" Client->>Handler : "PUT /signaling (创建会话)" Handler->>Store : "初始化会话映射" Handler-->>Client : "{ sessionId }" Client->>Handler : "PUT /signaling/connection (创建连接)" Handler->>Store : "登记连接ID与配对" Handler-->>Client : "{ connectionId, polite }" Client->>Handler : "GET /signaling/offer?fromtime" Handler->>Store : "按模式过滤并返回offer列表" Client->>Handler : "GET /signaling (全量信令)" Handler->>Store : "聚合连接/断线/offer/answer/candidate" Handler-->>Client : "{ messages, datetime }" Client->>Handler : "DELETE /signaling/connection" Handler->>Store : "清理连接与配对" ``` **图表来源** - [src/class/httphandler.ts:664-783](file://src/class/httphandler.ts#L664-L783) - [src/class/httphandler.ts:492-641](file://src/class/httphandler.ts#L492-L641) **章节来源** - [src/class/httphandler.ts:1-800](file://src/class/httphandler.ts#L1-L800) ### 代码规范与测试 - ESLint 规则启用 TypeScript 推荐规则与 Jest 推荐规则,强制分号与多余分号检查。 - Jest 配置启用覆盖率收集、TS 转换、Node 环境与测试匹配规则。 - TypeScript 编译配置输出至 build 目录,源码位于 src,测试位于 test。 **章节来源** - [.eslintrc.cjs:1-25](file://.eslintrc.cjs#L1-L25) - [jest.config.js:1-196](file://jest.config.js#L1-L196) - [tsconfig.json:1-13](file://tsconfig.json#L1-L13) ## 依赖关系分析 - 后端运行时依赖:Express、WS、CORS、Morgan、Multer、Swagger。 - 开发依赖:Jest、TS-Jest、ESLint、TypeScript、pkg 等。 - 构建与打包:通过 TypeScript 编译与 pkg 配置,打包静态资源与前端模块。 ```mermaid graph LR PKG["package.json"] --> DEPS["运行时依赖"] PKG --> DEVDEPS["开发依赖"] PKG --> BIN["构建与打包配置"] BIN --> TSC["tsconfig.json"] BIN --> ESL["eslint配置"] BIN --> JST["jest配置"] ``` **图表来源** - [package.json:1-60](file://package.json#L1-L60) - [tsconfig.json:1-13](file://tsconfig.json#L1-L13) - [.eslintrc.cjs:1-25](file://.eslintrc.cjs#L1-L25) - [jest.config.js:1-196](file://jest.config.js#L1-L196) **章节来源** - [package.json:1-60](file://package.json#L1-L60) ## 性能考量 - WebSocket 心跳与超时:处理器内置心跳检测与超时断开逻辑,避免僵尸连接占用资源。 - HTTP 轮询:提供 fromtime 参数过滤增量消息,降低带宽与计算压力。 - 日志与中间件:morgan 日志级别可配置,建议在生产环境调整为合适级别。 - 静态资源:静态目录与前端模块统一托管,确保缓存与压缩策略一致。 **章节来源** - [src/class/websockethandler.ts:404-430](file://src/class/websockethandler.ts#L404-L430) - [src/server.ts:17-20](file://src/server.ts#L17-L20) ## 故障排查指南 - 启动失败 - 检查证书文件路径与权限(HTTPS 模式),确认端口占用与网络接口。 - 信令异常 - 确认信令模式(WebSocket/HTTP)与通信模式(public/private)配置一致。 - 查看日志输出定位连接组状态与消息转发问题。 - 测试失败 - 使用 Jest 覆盖率报告定位未覆盖路径,修正测试用例与模拟。 - 规范检查 - 运行 ESLint 并修复规则冲突,确保提交前通过静态检查。 **章节来源** - [src/index.ts:52-91](file://src/index.ts#L52-L91) - [src/server.ts:25-42](file://src/server.ts#L25-L42) - [jest.config.js:19-26](file://jest.config.js#L19-L26) - [.eslintrc.cjs:18-23](file://.eslintrc.cjs#L18-L23) ## 结论 本指南提供了从开发环境准备到贡献流程、代码审查、Issue 规范、版本发布与变更日志维护、社区协作的完整实践路径。建议贡献者在提交前完成本地测试与规范检查,并遵循分支命名与提交信息格式,确保高质量交付。 ## 附录 ### 代码贡献流程 - Fork 仓库 - 在代码托管平台执行 Fork 操作,获得个人副本。 - Clone 与安装 - 克隆到本地,安装依赖并运行开发脚本。 - 分支与提交 - 基于主分支创建特性分支,遵循分支命名规范与提交信息格式。 - Pull Request - 提交 PR,填写模板信息,等待审查与合并。 **章节来源** - [package.json:5-12](file://package.json#L5-L12) ### 分支命名规范与提交信息格式 - 分支命名 - feat/xxx:新增功能 - fix/xxx:缺陷修复 - docs/xxx:文档更新 - refactor/xxx:重构 - test/xxx:测试相关 - 提交信息格式 - 类型(scope): 描述 - 例如:feat(server): 支持自定义日志级别 ### 代码审查标准与流程 - 审查清单 - 功能正确性与边界条件 - 性能影响与资源占用 - 日志与错误处理 - 单元测试覆盖率 - 规范检查通过 - 审查流程 - 提交 PR → 指派审查者 → 评论与修改 → 合并 ### Issue 提交规范 - Bug 报告 - 环境信息、复现步骤、期望/实际结果、日志片段 - 功能请求 - 背景、需求描述、影响范围、优先级建议 ### 版本发布与变更日志维护 - 版本号 - 遵循语义化版本:主版本.次版本.修订 - 变更日志 - 按版本记录新增、修复、变更与废弃项,标注影响与迁移指引 ### 社区行为准则与协作规范 - 尊重与包容:保持友善与专业 - 明确沟通:使用清晰、简洁的语言 - 合规贡献:遵守开源许可证与安全政策 ### 新贡献者入门指导与资源链接 - 环境准备 - Node.js、TypeScript、Git 基础 - 本地运行 - 使用开发脚本启动服务,访问静态页面与 Swagger 文档 - 学习资源 - Express、WebSocket、WebRTC 信令基础 - Jest 与 ESLint 使用指南