Files
video_socket-server/.qoder/repowiki/zh/content/服务器核心/服务器入口点.md
2026-05-16 13:24:02 +08:00

378 lines
16 KiB
Markdown
Raw 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>
**本文引用的文件**
- [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)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件聚焦于服务器入口点模块,系统性阐述 RenderStreaming 类的设计与实现覆盖命令行参数解析、配置选项处理、服务器启动流程、HTTPS 与 HTTP 信令协议选择、通信模式(公开/私有)以及启动时的参数验证与默认值处理。同时提供多种启动配置示例、最佳实践建议、错误处理与配置验证的实现细节。
## 项目结构
服务器入口点位于后端源码的入口文件中,配合 Express 应用创建、HTTP 信令路由、WebSocket 信令服务以及日志模块共同构成完整的启动与运行体系。
```mermaid
graph TB
A["src/index.ts<br/>入口与启动"] --> B["src/server.ts<br/>Express应用创建"]
A --> C["src/websocket.ts<br/>WebSocket信令服务"]
A --> D["src/class/options.ts<br/>配置接口"]
B --> E["src/signaling.ts<br/>HTTP信令路由"]
E --> F["src/class/httphandler.ts<br/>HTTP信令处理器"]
C --> G["src/class/websockethandler.ts<br/>WebSocket信令处理器"]
A --> H["src/log.ts<br/>日志模块"]
I["package.json<br/>脚本与构建配置"] --> 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、日志级别。
- 默认值策略:端口默认 80HTTPS 默认开启;信令类型默认 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.ServerHTTP直接 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["查询操作<br/>getAll/getOffer/getAnswer/getCandidate/getConnection"]
Route --> |PUT| PutOps["写入/创建操作<br/>createSession/createConnection"]
Route --> |DELETE| DelOps["删除操作<br/>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参数解析、expressWeb 框架、https/http服务器、fs/os证书读取与地址枚举、wsWebSocket、morganHTTP 日志、cors/multer/swagger中间件与静态资源
- 入口与应用RenderStreaming 依赖 createServercreateServer 依赖 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/nonenone 会禁用日志输出。
- 使用 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)