Files
video_socket-server/.qoder/repowiki/zh/content/信令系统/信令路由配置.md
2026-05-16 13:24:02 +08:00

340 lines
15 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/signaling.ts](file://src/signaling.ts)
- [src/websocket.ts](file://src/websocket.ts)
- [src/class/httphandler.ts](file://src/class/httphandler.ts)
- [src/class/websockethandler.ts](file://src/class/websockethandler.ts)
- [src/class/options.ts](file://src/class/options.ts)
- [src/log.ts](file://src/log.ts)
- [src/swagger.ts](file://src/swagger.ts)
- [package.json](file://package.json)
- [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. [附录](#附录)
## 简介
本文件面向信令服务器的路由配置与运行机制,覆盖 WebSocket 与 HTTP 两种信令模式的路由规则、中间件与消息分发逻辑、端点配置项端口、SSL 证书、CORS、启动流程与配置参数、最佳实践与性能优化、故障排除与常见问题以及实际配置示例与部署注意事项。
## 项目结构
- 应用入口与启动命令行参数解析、HTTP/HTTPS 服务器创建、WebSocket 信令服务启动。
- 服务器配置Express 中间件、CORS、日志、静态资源、Swagger 文档。
- 信令路由HTTP 路由挂载至 /signalingWebSocket 信令服务独立于 HTTP 服务。
- 处理器HTTP 与 WebSocket 两类处理器分别管理会话、连接、信令消息与广播。
```mermaid
graph TB
A["命令行入口<br/>src/index.ts"] --> B["Express 应用创建<br/>src/server.ts"]
B --> C["HTTP 信令路由挂载<br/>src/signaling.ts"]
B --> D["静态资源与上传接口<br/>src/server.ts"]
B --> E["Swagger 文档<br/>src/swagger.ts"]
A --> F["HTTPS/HTTP 服务器启动<br/>src/index.ts"]
F --> G["WebSocket 信令服务<br/>src/websocket.ts"]
G --> H["WebSocket 处理器<br/>src/class/websockethandler.ts"]
C --> I["HTTP 处理器<br/>src/class/httphandler.ts"]
```
**图表来源**
- [src/index.ts:13-109](file://src/index.ts#L13-L109)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [src/signaling.ts:4-24](file://src/signaling.ts#L4-L24)
- [src/websocket.ts:6-118](file://src/websocket.ts#L6-L118)
- [src/class/websockethandler.ts:63-137](file://src/class/websockethandler.ts#L63-L137)
- [src/class/httphandler.ts:110-120](file://src/class/httphandler.ts#L110-L120)
**章节来源**
- [src/index.ts:13-109](file://src/index.ts#L13-L109)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
## 核心组件
- 选项解析与启动流程命令行参数解析、HTTPS/HTTP 选择、端口、日志级别、信令模式与通信模式。
- Express 应用与中间件CORS、日志、静态资源、上传接口、Swagger。
- HTTP 信令路由:/signaling 下的 GET/PUT/DELETE/POST 路由,配合会话 ID 中间件。
- WebSocket 信令服务:独立于 HTTP 的 ws 服务器,消息类型与广播逻辑。
- 处理器HTTP 处理器(会话/连接/信令存储与查询、WebSocket 处理器(连接组、广播、心跳)。
**章节来源**
- [src/index.ts:16-42](file://src/index.ts#L16-L42)
- [src/server.ts:18-22](file://src/server.ts#L18-L22)
- [src/signaling.ts:6-24](file://src/signaling.ts#L6-L24)
- [src/websocket.ts:15-118](file://src/websocket.ts#L15-L118)
- [src/class/httphandler.ts:110-120](file://src/class/httphandler.ts#L110-L120)
- [src/class/websockethandler.ts:63-137](file://src/class/websockethandler.ts#L63-L137)
## 架构总览
信令服务器同时支持 HTTP 与 WebSocket 两种模式:
- HTTP 模式:通过 /signaling 路由进行轮询式信令交换,依赖 session-id 请求头进行会话隔离。
- WebSocket 模式:通过独立的 ws 服务器进行实时双向通信支持广播、1对多连接组、心跳检测与断线通知。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant HTTP as "HTTP 服务器<br/>Express"
participant Sig as "HTTP 信令路由<br/>/signaling"
participant Hdl as "HTTP 处理器"
participant WS as "WebSocket 服务器"
participant WSH as "WebSocket 处理器"
Client->>HTTP : "GET /config"
HTTP-->>Client : "{useWebSocket, startupMode, logging}"
Client->>HTTP : "PUT /signaling (创建会话)"
HTTP->>Sig : "路由匹配"
Sig->>Hdl : "createSession()"
Hdl-->>HTTP : "返回 sessionId"
HTTP-->>Client : "sessionId"
Note over Client,HTTP : "HTTP 轮询模式"
Client->>HTTP : "GET /signaling/offer?fromtime=..."
HTTP->>Sig : "路由匹配"
Sig->>Hdl : "getOffer()"
Hdl-->>HTTP : "返回 offer 列表"
HTTP-->>Client : "信令数据"
Note over Client,WS : "WebSocket 实时模式"
Client->>WS : "建立 ws : //... 连接"
WS->>WSH : "connection 事件"
WSH->>Client : "connect 消息"
Client->>WS : "发送 offer/answer/candidate"
WS->>WSH : "onOffer/onAnswer/onCandidate"
WSH-->>Client : "转发对应信令"
```
**图表来源**
- [src/server.ts:25-29](file://src/server.ts#L25-L29)
- [src/signaling.ts:6-24](file://src/signaling.ts#L6-L24)
- [src/class/httphandler.ts:661-675](file://src/class/httphandler.ts#L661-L675)
- [src/class/httphandler.ts:492-501](file://src/class/httphandler.ts#L492-L501)
- [src/websocket.ts:27-115](file://src/websocket.ts#L27-L115)
- [src/class/websockethandler.ts:145-168](file://src/class/websockethandler.ts#L145-L168)
## 详细组件分析
### HTTP 信令路由与中间件
- 路由挂载:/signaling 下的 GET/PUT/DELETE/POST 路由,统一由 HTTP 处理器实现。
- 会话中间件:校验请求头 session-id 是否存在,不存在则返回 404存在则更新会话最后请求时间。
- 会话与连接管理:创建/删除会话、创建/删除连接、查询连接列表、查询所有信令消息。
- 信令存储与查询Offer/Answer/Candidate 存储与按时间过滤查询;公共/私有模式下的路由差异。
- CORS 与日志:全局启用 CORS允许任意源按配置输出 HTTP 访问日志。
```mermaid
flowchart TD
Start(["HTTP 请求进入 /signaling"]) --> CheckSession["检查 session-id 头部"]
CheckSession --> SessionExists{"会话存在?"}
SessionExists --> |否| Return404["返回 404"]
SessionExists --> |是| UpdateTime["更新会话最后请求时间"]
UpdateTime --> RouteMatch["匹配具体路由"]
RouteMatch --> Handler["调用对应 HTTP 处理器函数"]
Handler --> Store["存储/查询信令数据"]
Store --> Response["返回 JSON 响应"]
```
**图表来源**
- [src/signaling.ts:6-24](file://src/signaling.ts#L6-L24)
- [src/class/httphandler.ts:128-145](file://src/class/httphandler.ts#L128-L145)
- [src/class/httphandler.ts:398-407](file://src/class/httphandler.ts#L398-L407)
**章节来源**
- [src/signaling.ts:6-24](file://src/signaling.ts#L6-L24)
- [src/class/httphandler.ts:128-145](file://src/class/httphandler.ts#L128-L145)
- [src/class/httphandler.ts:398-407](file://src/class/httphandler.ts#L398-L407)
### WebSocket 信令服务与消息分发
- 服务器创建:基于现有 HTTP 服务器创建 ws 服务器,独立于 HTTP。
- 连接生命周期:连接建立、消息处理、断开清理。
- 消息类型connect/disconnect/offer/answer/candidate/broadcast/ping/pong/call-request/on-message。
- 1对多模式host 与 participants 的角色与消息路由;广播到组内成员;断线通知。
- 心跳检测:定期 ping/pong超时自动断开。
```mermaid
sequenceDiagram
participant WS as "WebSocket 服务器"
participant WSH as "WebSocket 处理器"
participant C1 as "客户端1(host)"
participant C2 as "客户端2(participant)"
WS->>WSH : "connection(ws)"
WSH->>C1 : "connect {role : host}"
WSH->>C2 : "connect {role : participant}"
C1->>WS : "offer {connectionId, sdp}"
WS->>WSH : "onOffer"
WSH-->>C2 : "转发 offer"
C2->>WS : "answer {connectionId, sdp}"
WS->>WSH : "onAnswer"
WSH-->>C1 : "转发 answer"
C1->>WS : "broadcast {message}"
WS->>WSH : "onBroadcast"
WSH-->>C2 : "广播消息"
C1->>WS : "disconnect"
WS->>WSH : "onDisconnect"
WSH-->>C2 : "通知 host 离开"
```
**图表来源**
- [src/websocket.ts:27-115](file://src/websocket.ts#L27-L115)
- [src/class/websockethandler.ts:145-301](file://src/class/websockethandler.ts#L145-L301)
- [src/class/websockethandler.ts:370-402](file://src/class/websockethandler.ts#L370-L402)
**章节来源**
- [src/websocket.ts:15-118](file://src/websocket.ts#L15-L118)
- [src/class/websockethandler.ts:145-301](file://src/class/websockethandler.ts#L145-L301)
- [src/class/websockethandler.ts:370-402](file://src/class/websockethandler.ts#L370-L402)
### 选项与启动流程
- 命令行参数端口、HTTPS 开关、证书路径、信令类型websocket/http、通信模式public/private、日志级别。
- 服务器创建:根据 secure 选择 HTTPS 或 HTTP读取 key/cert 文件;监听端口并打印访问地址。
- 信令类型校验:非 websocket/http 的值将被修正为 websocket 并给出警告。
- WebSocket 启动:当 type 为 websocket 时,创建 WSSignaling 实例并传入通信模式。
```mermaid
flowchart TD
Parse["解析命令行参数"] --> CreateApp["创建 Express 应用"]
CreateApp --> Secure{"secure ?"}
Secure --> |是| HTTPS["创建 HTTPS 服务器"]
Secure --> |否| HTTP["创建 HTTP 服务器"]
HTTPS --> Listen["监听端口并打印地址"]
HTTP --> Listen
Listen --> Type{"type == http ?"}
Type --> |是| LogHttp["记录使用 HTTP 轮询"]
Type --> |否| FixType["修正为 websocket 并记录警告"]
LogHttp --> Done
FixType --> Done
Done --> WS{"type == websocket ?"}
WS --> |是| StartWS["启动 WebSocket 信令服务"]
WS --> |否| End
```
**图表来源**
- [src/index.ts:20-42](file://src/index.ts#L20-L42)
- [src/index.ts:55-82](file://src/index.ts#L55-L82)
- [src/index.ts:87-88](file://src/index.ts#L87-L88)
**章节来源**
- [src/index.ts:20-42](file://src/index.ts#L20-L42)
- [src/index.ts:55-82](file://src/index.ts#L55-L82)
- [src/index.ts:87-88](file://src/index.ts#L87-L88)
### CORS 与静态资源
- CORS全局启用允许任意源访问。
- 静态资源:/ 与 /module 路径的静态文件服务。
- 上传接口multer 存储头像到 uploads/avatars重命名为以 userId 命名的文件并返回访问路径。
**章节来源**
- [src/server.ts:22](file://src/server.ts#L22)
- [src/server.ts:27-28](file://src/server.ts#L27-L28)
- [src/server.ts:62-86](file://src/server.ts#L62-L86)
### Swagger 文档
- 自动扫描 HTTP 处理器与路由文件,生成 OpenAPI 文档,暴露 /api-docs。
- 使用 session-id 作为 API Key 安全方案。
**章节来源**
- [src/swagger.ts:16-65](file://src/swagger.ts#L16-L65)
## 依赖关系分析
```mermaid
graph LR
Index["src/index.ts"] --> Server["src/server.ts"]
Index --> WS["src/websocket.ts"]
Server --> Sig["src/signaling.ts"]
Sig --> Hdl["src/class/httphandler.ts"]
WS --> WSH["src/class/websockethandler.ts"]
Server --> Swagger["src/swagger.ts"]
Server --> Log["src/log.ts"]
Index --> Opt["src/class/options.ts"]
Package["package.json"] --> Server
Package --> WS
```
**图表来源**
- [src/index.ts:13-109](file://src/index.ts#L13-L109)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [src/signaling.ts:4-24](file://src/signaling.ts#L4-L24)
- [src/websocket.ts:6-118](file://src/websocket.ts#L6-L118)
- [src/class/httphandler.ts:110-120](file://src/class/httphandler.ts#L110-L120)
- [src/class/websockethandler.ts:63-137](file://src/class/websockethandler.ts#L63-L137)
- [src/swagger.ts:16-65](file://src/swagger.ts#L16-L65)
- [src/log.ts:15-24](file://src/log.ts#L15-L24)
- [src/class/options.ts:1-10](file://src/class/options.ts#L1-L10)
- [package.json:14-27](file://package.json#L14-L27)
**章节来源**
- [src/index.ts:13-109](file://src/index.ts#L13-L109)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [package.json:14-27](file://package.json#L14-L27)
## 性能考量
- HTTP 轮询 vs WebSocketWebSocket 适合低延迟实时通信HTTP 轮询简单但有额外网络开销。
- 会话超时HTTP 处理器按 10 秒超时清理长时间无请求的会话,避免内存泄漏。
- 广播与路由WebSocket 广播需注意组内成员数量,避免大规模广播造成拥塞。
- 日志级别:生产环境建议降低日志级别,减少 I/O 压力。
- 静态资源与上传:确保上传目录存在并限制文件大小,避免磁盘压力。
[本节为通用指导,无需列出具体文件来源]
## 故障排除指南
- 会话不存在HTTP 路由在缺少 session-id 或会话不存在时返回 404。
- 会话超时:长时间无请求导致会话被清理,重新创建会话并获取新的 session-id。
- 信令类型错误:非 websocket/http 的 type 将被修正为 websocket 并记录警告。
- CORS 问题:默认允许任意源,若遇到跨域,请检查客户端与服务器同源策略。
- 上传失败:确认 uploads/avatars 目录存在且可写,检查文件名重命名逻辑。
**章节来源**
- [src/class/httphandler.ts:128-145](file://src/class/httphandler.ts#L128-L145)
- [src/class/httphandler.ts:218-232](file://src/class/httphandler.ts#L218-L232)
- [src/index.ts:78-82](file://src/index.ts#L78-L82)
- [src/server.ts:22](file://src/server.ts#L22)
- [src/server.ts:44-57](file://src/server.ts#L44-L57)
## 结论
本信令服务器通过 Express 提供 HTTP 轮询与 WebSocket 实时两种信令模式结合会话与连接管理、CORS、日志与 Swagger 文档形成完整的信令基础设施。合理配置端口、SSL 证书与通信模式,可满足不同场景需求;通过测试用例可验证 HTTP 与 WebSocket 的行为一致性。
[本节为总结性内容,无需列出具体文件来源]
## 附录
### 信令端点配置选项
- 端口:通过命令行参数 -p/--port 指定,默认来自环境变量 PORT。
- SSL 证书:通过 -s/--secure 开启 HTTPS-k/--keyfile 与 -c/--certfile 指定密钥与证书路径。
- 信令类型:-t/--type 选择 websocket 或 http。
- 通信模式:-m/--mode 选择 public 或 private。
- 日志级别:-l/--logging 选择 combined/dev/short/tiny 或 none。
**章节来源**
- [src/index.ts:20-29](file://src/index.ts#L20-L29)
- [package.json:9-10](file://package.json#L9-L10)
### 启动流程与配置参数
- 启动命令示例:参考 package.json 中的 start/dev 脚本,包含端口、模式、证书等参数。
- 服务器启动:根据 secure 决定 HTTPS/HTTP打印访问地址根据 type 启动 WebSocket 或记录 HTTP 轮询模式。
**章节来源**
- [package.json:9-10](file://package.json#L9-L10)
- [src/index.ts:55-82](file://src/index.ts#L55-L82)
### 路由配置最佳实践
- 优先使用 WebSocket实时性要求高时采用 WebSocketHTTP 轮询仅用于兼容性或受限网络。
- 明确通信模式public 模式下跨会话广播private 模式下严格按连接组路由。
- 控制日志级别:生产环境避免高频日志,必要时仅保留 warn/info。
- CORS 与静态资源:生产环境建议限制 CORS 源,静态资源开启缓存策略。
[本节为通用指导,无需列出具体文件来源]
### 实际配置示例与部署注意事项
- 示例:使用 HTTPS端口 8080private 模式WebSocket 信令。
- 部署:确保 server.key 与 server.cert 存在;防火墙开放端口;反向代理(如 Nginx可前置以支持 TLS 终止与负载均衡。
**章节来源**
- [package.json:9-10](file://package.json#L9-L10)
- [src/index.ts:55-65](file://src/index.ts#L55-L65)