# 信令路由配置
**本文档引用的文件**
- [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)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向信令服务器的路由配置与运行机制,覆盖 WebSocket 与 HTTP 两种信令模式的路由规则、中间件与消息分发逻辑、端点配置项(端口、SSL 证书、CORS)、启动流程与配置参数、最佳实践与性能优化、故障排除与常见问题,以及实际配置示例与部署注意事项。
## 项目结构
- 应用入口与启动:命令行参数解析、HTTP/HTTPS 服务器创建、WebSocket 信令服务启动。
- 服务器配置:Express 中间件、CORS、日志、静态资源、Swagger 文档。
- 信令路由:HTTP 路由挂载至 /signaling;WebSocket 信令服务独立于 HTTP 服务。
- 处理器:HTTP 与 WebSocket 两类处理器分别管理会话、连接、信令消息与广播。
```mermaid
graph TB
A["命令行入口
src/index.ts"] --> B["Express 应用创建
src/server.ts"]
B --> C["HTTP 信令路由挂载
src/signaling.ts"]
B --> D["静态资源与上传接口
src/server.ts"]
B --> E["Swagger 文档
src/swagger.ts"]
A --> F["HTTPS/HTTP 服务器启动
src/index.ts"]
F --> G["WebSocket 信令服务
src/websocket.ts"]
G --> H["WebSocket 处理器
src/class/websockethandler.ts"]
C --> I["HTTP 处理器
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 服务器
Express"
participant Sig as "HTTP 信令路由
/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 WebSocket:WebSocket 适合低延迟实时通信;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:实时性要求高时采用 WebSocket,HTTP 轮询仅用于兼容性或受限网络。
- 明确通信模式:public 模式下跨会话广播;private 模式下严格按连接组路由。
- 控制日志级别:生产环境避免高频日志,必要时仅保留 warn/info。
- CORS 与静态资源:生产环境建议限制 CORS 源,静态资源开启缓存策略。
[本节为通用指导,无需列出具体文件来源]
### 实际配置示例与部署注意事项
- 示例:使用 HTTPS,端口 8080,private 模式,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)