# 服务器入口点 **本文引用的文件** - [src/index.ts](file://src/index.ts) - [src/server.ts](file://src/server.ts) - [src/class/options.ts](file://src/class/options.ts) - [src/websocket.ts](file://src/websocket.ts) - [src/class/websockethandler.ts](file://src/class/websockethandler.ts) - [src/class/httphandler.ts](file://src/class/httphandler.ts) - [src/signaling.ts](file://src/signaling.ts) - [src/log.ts](file://src/log.ts) - [package.json](file://package.json) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本文件聚焦于服务器入口点模块,系统性阐述 RenderStreaming 类的设计与实现,覆盖命令行参数解析、配置选项处理、服务器启动流程、HTTPS 与 HTTP 信令协议选择、通信模式(公开/私有)以及启动时的参数验证与默认值处理。同时提供多种启动配置示例、最佳实践建议、错误处理与配置验证的实现细节。 ## 项目结构 服务器入口点位于后端源码的入口文件中,配合 Express 应用创建、HTTP 信令路由、WebSocket 信令服务以及日志模块共同构成完整的启动与运行体系。 ```mermaid graph TB A["src/index.ts
入口与启动"] --> B["src/server.ts
Express应用创建"] A --> C["src/websocket.ts
WebSocket信令服务"] A --> D["src/class/options.ts
配置接口"] B --> E["src/signaling.ts
HTTP信令路由"] E --> F["src/class/httphandler.ts
HTTP信令处理器"] C --> G["src/class/websockethandler.ts
WebSocket信令处理器"] A --> H["src/log.ts
日志模块"] I["package.json
脚本与构建配置"] --> A ``` **图表来源** - [src/index.ts:13-109](file://src/index.ts#L13-L109) - [src/server.ts:14-89](file://src/server.ts#L14-L89) - [src/websocket.ts:6-118](file://src/websocket.ts#L6-L118) - [src/class/options.ts:1-10](file://src/class/options.ts#L1-L10) - [src/signaling.ts:1-25](file://src/signaling.ts#L1-L25) - [src/class/httphandler.ts:110-120](file://src/class/httphandler.ts#L110-L120) - [src/class/websockethandler.ts:63-66](file://src/class/websockethandler.ts#L63-L66) - [src/log.ts:1-51](file://src/log.ts#L1-L51) - [package.json:5-12](file://package.json#L5-L12) **章节来源** - [src/index.ts:13-109](file://src/index.ts#L13-L109) - [src/server.ts:14-89](file://src/server.ts#L14-L89) - [package.json:5-12](file://package.json#L5-L12) ## 核心组件 - RenderStreaming:负责命令行参数解析、配置读取、HTTP/HTTPS 服务器创建、信令协议选择与启动。 - Options 接口:统一承载端口、HTTPS 文件、信令类型、通信模式、日志级别等配置项。 - createServer:基于 Options 构建 Express 应用,挂载静态资源、Swagger 文档、HTTP 信令路由与上传接口。 - WSSignaling:当信令类型为 WebSocket 时,启动 WebSocket 信令服务并交由 websockethandler 处理。 - HTTP 信令处理器:提供会话管理、offer/answer/candidate 的存储与查询接口。 - 日志模块:统一输出级别控制与格式化输出。 **章节来源** - [src/index.ts:13-109](file://src/index.ts#L13-L109) - [src/class/options.ts:1-10](file://src/class/options.ts#L1-L10) - [src/server.ts:14-89](file://src/server.ts#L14-L89) - [src/websocket.ts:6-118](file://src/websocket.ts#L6-L118) - [src/class/websockethandler.ts:63-66](file://src/class/websockethandler.ts#L63-L66) - [src/class/httphandler.ts:110-120](file://src/class/httphandler.ts#L110-L120) - [src/log.ts:1-51](file://src/log.ts#L1-L51) ## 架构总览 RenderStreaming.run 是主入口,内部使用 commandeer 解析命令行参数,随后根据配置创建 Express 应用;若启用 HTTPS,则以密钥与证书文件创建 HTTPS 服务器;否则使用 HTTP。随后根据信令类型选择 WebSocket 或 HTTP 信令通道,并打印启动信息与地址。 ```mermaid sequenceDiagram participant CLI as "命令行" participant RS as "RenderStreaming" participant CS as "createServer" participant APP as "Express应用" participant WS as "WSSignaling" participant LOG as "日志模块" CLI->>RS : 传入 argv RS->>RS : 解析命令行参数与环境变量 RS->>CS : 传入 Options CS-->>APP : 返回 Express 应用 RS->>RS : 判断 secure 与 type alt HTTPS 启用 RS->>RS : 读取 keyfile/certfile RS->>APP : 创建 HTTPS 服务器 else HTTP RS->>APP : 创建 HTTP 服务器 end opt type=websocket RS->>WS : 初始化 WebSocket 信令 WS->>LOG : 输出 ws 地址 end RS->>LOG : 输出启动模式与日志级别 ``` **图表来源** - [src/index.ts:14-109](file://src/index.ts#L14-L109) - [src/server.ts:14-89](file://src/server.ts#L14-L89) - [src/websocket.ts:15-118](file://src/websocket.ts#L15-L118) - [src/log.ts:30-50](file://src/log.ts#L30-L50) **章节来源** - [src/index.ts:14-109](file://src/index.ts#L14-L109) ## 详细组件分析 ### RenderStreaming 类设计与实现 - 命令行参数解析与默认值 - 使用 commandeer 定义选项:端口、HTTPS 开关与证书文件、信令类型(websocket/http)、通信模式(public/private)、日志级别。 - 默认值策略:端口默认 80;HTTPS 默认开启;信令类型默认 websocket;通信模式默认 public;日志默认 dev。 - 环境变量回退:PORT、SECURE、KEYFILE、CERTFILE、TYPE、MODE、LOGGING。 - 配置读取与校验 - 读取 program.opts() 并构造 Options 对象,对 secure 与 type 进行布尔化与类型修正。 - 若 type 非 websocket 且非 http,则警告并强制回退为 websocket。 - 服务器启动 - 创建 Express 应用:createServer(options)。 - HTTPS:读取 keyfile/certfile 并创建 https.Server;HTTP:直接 app.listen。 - 打印监听地址(支持多网卡 IPv4)。 - 依据 type 启动 WebSocket 信令或提示使用 HTTP 轮询。 - 输出当前通信模式。 ```mermaid flowchart TD Start(["入口 run(argv)"]) --> Parse["解析命令行与环境变量"] Parse --> BuildOpts["构造 Options 对象"] BuildOpts --> TypeCheck{"type 是否为 websocket 或 http"} TypeCheck --> |否| Warn["记录警告并回退为 websocket"] TypeCheck --> |是| CreateApp["createServer(options)"] Warn --> CreateApp CreateApp --> Secure{"secure 为真?"} Secure --> |是| HTTPS["读取 key/cert 并创建 https.Server"] Secure --> |否| HTTP["app.listen()"] HTTPS --> PrintAddr["打印监听地址"] HTTP --> PrintAddr PrintAddr --> Mode["输出启动模式"] Mode --> End(["完成"]) ``` **图表来源** - [src/index.ts:14-109](file://src/index.ts#L14-L109) **章节来源** - [src/index.ts:14-109](file://src/index.ts#L14-L109) ### Options 配置管理 - 字段定义:secure、port、keyfile、certfile、type、mode、logging。 - 作用范围:贯穿 Express 应用、HTTPS 服务器、WebSocket/HTTP 信令、日志级别控制。 - 默认值与回退:参见“命令行参数解析与默认值”小节。 **章节来源** - [src/class/options.ts:1-10](file://src/class/options.ts#L1-L10) - [src/index.ts:20-41](file://src/index.ts#L20-L41) ### 服务器启动流程与 Express 应用 - createServer 负责: - 重置 HTTP 信令处理器模式(resetHandler)。 - 条件化 Morgan 日志(logging != "none")。 - CORS、URL 编码、JSON 解析。 - 提供 /config 接口返回当前信令类型、启动模式与日志级别。 - 挂载 /signaling 路由(HTTP 信令)。 - 提供静态页面与模块目录。 - 初始化 Swagger 文档。 - 配置头像上传接口与目录结构。 ```mermaid sequenceDiagram participant RS as "RenderStreaming" participant CS as "createServer" participant APP as "Express 应用" participant SIG as "HTTP 信令路由" participant HH as "HTTP 信令处理器" RS->>CS : 传入 Options CS->>APP : 初始化中间件与静态资源 CS->>SIG : 挂载 /signaling 路由 SIG->>HH : 调用处理器函数 CS-->>RS : 返回 APP 实例 ``` **图表来源** - [src/server.ts:14-89](file://src/server.ts#L14-L89) - [src/signaling.ts:1-25](file://src/signaling.ts#L1-L25) - [src/class/httphandler.ts:110-120](file://src/class/httphandler.ts#L110-L120) **章节来源** - [src/server.ts:14-89](file://src/server.ts#L14-L89) ### WebSocket 信令服务 - WSSignaling 在 HTTP 服务器上创建 ws.Server,并根据通信模式初始化 websockethandler。 - 连接生命周期:connection、message、close。 - 支持的消息类型:connect/disconnect、offer/answer/candidate、broadcast、call-request、on-message(含 ping/pong 心跳)。 - 私有模式下的主机与参与者角色管理、广播与单播路由。 ```mermaid classDiagram class WSSignaling { +server +wss +constructor(server, mode) } class WebSocketHandler { +reset(mode) +add(ws) +remove(ws) +onConnect(ws, connectionId) +onDisconnect(ws, connectionId) +onOffer(ws, message) +onAnswer(ws, message) +onCandidate(ws, message) +onBroadcast(ws, message) +onCallConnectionId(ws, message) +onMessage(ws, message) } WSSignaling --> WebSocketHandler : "初始化与消息分发" ``` **图表来源** - [src/websocket.ts:6-118](file://src/websocket.ts#L6-L118) - [src/class/websockethandler.ts:63-66](file://src/class/websockethandler.ts#L63-L66) **章节来源** - [src/websocket.ts:6-118](file://src/websocket.ts#L6-L118) - [src/class/websockethandler.ts:145-473](file://src/class/websockethandler.ts#L145-L473) ### HTTP 信令处理器 - 会话与连接管理:会话 ID、连接 ID、连接对(connectionPair),私有模式下双向绑定。 - 信令存储:Offer/Answer/Candidate 结构与时间戳,按会话与连接维度组织。 - 查询接口:/signaling、/signaling/connection、/signaling/offer、/signaling/answer、/signaling/candidate。 - 写入接口:POST /signaling/offer、/answer、/candidate。 - 会话超时清理:定期检查并删除超时会话。 - 房间与用户统计:聚合连接对信息,输出房间列表与用户数。 ```mermaid flowchart TD S(["HTTP 信令请求"]) --> CheckSID["校验 session-id"] CheckSID --> Route{"路由类型"} Route --> |GET| GetOps["查询操作
getAll/getOffer/getAnswer/getCandidate/getConnection"] Route --> |PUT| PutOps["写入/创建操作
createSession/createConnection"] Route --> |DELETE| DelOps["删除操作
deleteSession/deleteConnection"] GetOps --> Store["按会话/连接维度读取存储"] PutOps --> Store DelOps --> Store Store --> Resp["返回 JSON 响应"] ``` **图表来源** - [src/signaling.ts:1-25](file://src/signaling.ts#L1-L25) - [src/class/httphandler.ts:398-998](file://src/class/httphandler.ts#L398-L998) **章节来源** - [src/signaling.ts:1-25](file://src/signaling.ts#L1-L25) - [src/class/httphandler.ts:110-120](file://src/class/httphandler.ts#L110-L120) - [src/class/httphandler.ts:398-998](file://src/class/httphandler.ts#L398-L998) ### 日志模块 - 日志级别枚举:none/error/warn/log/info,默认 info。 - 级别解析:字符串到枚举的映射,未知值回退为 info。 - 输出格式:ISO 时间戳 + 大写级别前缀 + 参数。 **章节来源** - [src/log.ts:1-51](file://src/log.ts#L1-L51) ## 依赖关系分析 - 入口依赖:commander(参数解析)、express(Web 框架)、https/http(服务器)、fs/os(证书读取与地址枚举)、ws(WebSocket)、morgan(HTTP 日志)、cors/multer/swagger(中间件与静态资源)。 - 入口与应用:RenderStreaming 依赖 createServer;createServer 依赖 HTTP 信令路由与处理器。 - 信令通道:WebSocket 与 HTTP 二选一,分别由 WSSignaling 与 HTTP 信令处理器承担。 ```mermaid graph TB IDX["src/index.ts"] --> CMDR["commander"] IDX --> EXP["express"] IDX --> HTTPS["https"] IDX --> FS["fs"] IDX --> OS["os"] IDX --> WSS["ws"] IDX --> MORGAN["morgan"] IDX --> CORS["cors"] IDX --> MULTER["multer"] IDX --> SWAG["swagger"] IDX --> SVR["src/server.ts"] IDX --> WS["src/websocket.ts"] SVR --> SIG["src/signaling.ts"] SIG --> HHT["src/class/httphandler.ts"] WS --> WHH["src/class/websockethandler.ts"] ``` **图表来源** - [src/index.ts:1-11](file://src/index.ts#L1-L11) - [src/server.ts:1-12](file://src/server.ts#L1-L12) - [src/websocket.ts:1-4](file://src/websocket.ts#L1-L4) - [src/signaling.ts:1-3](file://src/signaling.ts#L1-L3) - [src/class/httphandler.ts:5-11](file://src/class/httphandler.ts#L5-L11) - [src/class/websockethandler.ts:3-8](file://src/class/websockethandler.ts#L3-L8) **章节来源** - [src/index.ts:1-11](file://src/index.ts#L1-L11) - [src/server.ts:1-12](file://src/server.ts#L1-L12) ## 性能考量 - 服务器启动阶段: - HTTPS 证书文件读取发生在启动时,建议确保文件存在与权限正确,避免启动失败。 - 日志级别为 none 时可减少 I/O 开销。 - WebSocket 信令: - 私有模式下按连接组进行消息路由,避免全量广播带来的网络压力。 - 心跳检测可及时清理长时间无活动的连接,降低资源占用。 - HTTP 信令: - 会话超时机制定期清理无效会话,防止内存泄漏。 - GET 查询支持 fromtime 过滤,减少不必要的数据传输。 [本节为通用指导,无需具体文件引用] ## 故障排查指南 - 启动失败(HTTPS) - 症状:启动时报证书文件读取错误。 - 排查:确认 keyfile/certfile 路径正确且可读;secure 为 true 时必须提供有效证书。 - 参考:入口读取证书文件与创建 HTTPS 服务器的逻辑。 - 信令类型异常 - 症状:type 非 websocket 或 http 时被强制回退。 - 排查:检查命令行参数与环境变量 TYPE;确保只使用受支持的类型。 - 通信模式问题 - 症状:私有模式下连接对冲突或无法建立双向配对。 - 排查:确认 connectionId 未被重复使用;检查连接对映射与会话 ID 关联。 - 日志级别 - 症状:日志过多或过少。 - 排查:调整 logging 或使用 setLogLevel 控制输出级别。 - 上传接口失败 - 症状:头像上传报错或重命名失败。 - 排查:确认 uploads 目录存在且具备写权限;检查 userId 与文件扩展名处理。 **章节来源** - [src/index.ts:55-82](file://src/index.ts#L55-L82) - [src/class/websockethandler.ts:150-167](file://src/class/websockethandler.ts#L150-L167) - [src/class/httphandler.ts:754-782](file://src/class/httphandler.ts#L754-L782) - [src/log.ts:11-24](file://src/log.ts#L11-L24) - [src/server.ts:62-83](file://src/server.ts#L62-L83) ## 结论 RenderStreaming 将命令行参数解析、配置读取、服务器创建与信令通道选择整合为统一入口,结合 HTTP 与 WebSocket 两种信令模式满足不同部署场景需求。通过 Options 接口集中管理配置,配合 HTTP/WS 信令处理器实现可靠的信令传递与连接管理。建议在生产环境中优先使用 HTTPS 与 WebSocket,并合理设置日志级别与会话超时策略。 [本节为总结性内容,无需具体文件引用] ## 附录 ### 启动配置示例与最佳实践 - 使用 HTTPS 并自定义端口与证书 - 示例:node ./build/index.js -s -p 8443 -k ./server.key -c ./server.cert - 最佳实践:将证书置于安全目录,限制文件权限;使用强密码保护私钥。 - 使用 HTTP(不推荐生产) - 示例:node ./build/index.js -p 8080 -s false - 最佳实践:仅限开发调试;如需生产请改用 HTTPS。 - 选择 HTTP 轮询信令 - 示例:node ./build/index.js -t http -p 8080 -m private - 最佳实践:客户端需实现轮询拉取信令;注意带宽与延迟。 - 选择 WebSocket 信令与私有模式 - 示例:node ./build/index.js -t websocket -p 8080 -m private - 最佳实践:私有模式适合点对点或小房间;公共模式适合广播场景。 - 自定义日志级别 - 示例:node ./build/index.js -l combined -p 8080 - 可选值:combined/dev/short/tiny/none;none 会禁用日志输出。 - 使用 npm 脚本 - 开发:npm run dev - 生产:npm start - 参考:package.json 中 scripts 与 bin 配置。 **章节来源** - [package.json:5-12](file://package.json#L5-L12) - [src/index.ts:20-29](file://src/index.ts#L20-L29)