Files
2026-05-16 13:24:02 +08:00

393 lines
16 KiB
Markdown
Raw Permalink 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.
# API 参考
<cite>
**本文引用的文件**
- [src/index.ts](file://src/index.ts)
- [src/server.ts](file://src/server.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/class/offer.ts](file://src/class/offer.ts)
- [src/class/answer.ts](file://src/class/answer.ts)
- [src/class/candidate.ts](file://src/class/candidate.ts)
- [src/swagger.ts](file://src/swagger.ts)
- [src/signaling.ts](file://src/signaling.ts)
- [client/src/signaling.js](file://client/src/signaling.js)
- [client/src/peer.js](file://client/src/peer.js)
- [test/websockethandler.test.ts](file://test/websockethandler.test.ts)
- [test/httphandler.test.ts](file://test/httphandler.test.ts)
- [package.json](file://package.json)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件为视频流服务器的完整 API 参考,覆盖以下内容:
- WebSocket 信令 API连接建立、消息格式、事件类型与实时交互模式
- HTTP 轮询 API端点规范、请求/响应格式、状态码与错误处理
- Swagger 自动化文档:生成与访问方式
- 信令消息数据结构Offer、Answer、Candidate 等字段定义与使用场景
- 错误代码与处理指南
- API 使用示例与集成模板
## 项目结构
后端采用 Express 提供 HTTP 服务与静态资源WebSocket 用于实时信令HTTP 轮询模式通过 /signaling 路由提供信令存取能力。客户端提供基于 WebSocket 与 HTTP 轮询两种信令实现。
```mermaid
graph TB
subgraph "服务端"
A["Express 应用<br/>src/server.ts"]
B["WebSocket 信令<br/>src/websocket.ts"]
C["HTTP 轮询信令<br/>src/signaling.ts → src/class/httphandler.ts"]
D["数据模型<br/>src/class/offer.ts / answer.ts / candidate.ts"]
E["Swagger 文档<br/>src/swagger.ts"]
end
subgraph "客户端"
F["信令封装(HTTP)<br/>client/src/signaling.js"]
G["信令封装(WebSocket)<br/>client/src/signaling.js"]
H["Peer 连接控制<br/>client/src/peer.js"]
end
A --> B
A --> C
A --> E
B --> D
C --> D
F --> A
G --> B
H --> F
H --> G
```
图表来源
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [src/websocket.ts:6-118](file://src/websocket.ts#L6-L118)
- [src/signaling.ts:1-25](file://src/signaling.ts#L1-L25)
- [src/class/httphandler.ts:1-1130](file://src/class/httphandler.ts#L1-L1130)
- [src/class/offer.ts:1-11](file://src/class/offer.ts#L1-L11)
- [src/class/answer.ts:1-8](file://src/class/answer.ts#L1-L8)
- [src/class/candidate.ts:1-12](file://src/class/candidate.ts#L1-L12)
- [src/swagger.ts:16-65](file://src/swagger.ts#L16-L65)
- [client/src/signaling.js:1-292](file://client/src/signaling.js#L1-L292)
- [client/src/peer.js:1-188](file://client/src/peer.js#L1-L188)
章节来源
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [src/index.ts:13-109](file://src/index.ts#L13-L109)
## 核心组件
- 服务启动与配置命令行参数解析、HTTPS/HTTP 选择、日志级别、信令协议类型与通信模式
- Express 服务CORS、JSON/URL 编码、静态资源、/config、/signaling 路由挂载、Swagger 文档
- WebSocket 信令:连接生命周期、消息分发、广播、心跳与超时处理
- HTTP 轮询信令会话管理、连接管理、Offer/Answer/Candidate 存取、房间与用户信息查询
- 数据模型Offer、Answer、Candidate 结构体
- 客户端封装HTTP 与 WebSocket 两类信令客户端Peer 连接控制
章节来源
- [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/websockethandler.ts:1-479](file://src/class/websockethandler.ts#L1-L479)
- [src/class/httphandler.ts:1-1130](file://src/class/httphandler.ts#L1-L1130)
- [src/class/offer.ts:1-11](file://src/class/offer.ts#L1-L11)
- [src/class/answer.ts:1-8](file://src/class/answer.ts#L1-L8)
- [src/class/candidate.ts:1-12](file://src/class/candidate.ts#L1-L12)
- [src/swagger.ts:16-65](file://src/swagger.ts#L16-L65)
- [src/signaling.ts:1-25](file://src/signaling.ts#L1-L25)
- [client/src/signaling.js:1-292](file://client/src/signaling.js#L1-L292)
- [client/src/peer.js:1-188](file://client/src/peer.js#L1-L188)
## 架构总览
系统支持两种信令模式:
- WebSocket低延迟、全双工、事件驱动
- HTTP 轮询:兼容性好、部署简单、适合受限网络环境
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Server as "Express 服务"
participant WS as "WebSocket 信令"
participant HTTP as "HTTP 轮询信令"
Client->>Server : GET /config
Server-->>Client : {useWebSocket, startupMode, logging}
alt WebSocket 模式
Client->>WS : 建立 ws/wss 连接
WS-->>Client : "connect"含 role/polite/participantId
Client->>WS : "offer"/"answer"/"candidate"
WS-->>Client : 广播/定向转发对应信令
else HTTP 模式
Client->>HTTP : PUT "" 创建会话返回 sessionId
Client->>HTTP : PUT "/connection" 创建连接
loop 轮询
Client->>HTTP : GET "" /offer /answer /candidate
HTTP-->>Client : 返回增量信令
end
Client->>HTTP : POST "/offer" /answer /candidate
Client->>HTTP : DELETE "" 关闭会话
end
```
图表来源
- [src/server.ts:25-41](file://src/server.ts#L25-L41)
- [src/websocket.ts:27-115](file://src/websocket.ts#L27-L115)
- [src/class/httphandler.ts:664-696](file://src/class/httphandler.ts#L664-L696)
- [src/class/httphandler.ts:698-828](file://src/class/httphandler.ts#L698-L828)
- [src/class/httphandler.ts:830-998](file://src/class/httphandler.ts#L830-L998)
- [src/signaling.ts:6-24](file://src/signaling.ts#L6-L24)
## 详细组件分析
### WebSocket 信令 API
- 连接建立
- 客户端通过 ws/wss 连接到服务端
- 服务端在连接事件中注册处理器,维护连接集合与连接组
- 消息格式与事件类型
- connect/disconnect建立/断开连接,包含 connectionId、polite、role、participantId
- offer/answer/candidate信令三元组包含 from、to、data含 sdp 或 candidate/sdpMid/sdpMLineIndex、participantId
- ping/pong心跳机制
- broadcast/on-message广播消息与自定义消息
- participant-joined/participant-left多参与者的房间模式事件
- 实时交互模式
- 公共模式:同一房间内广播
- 私有模式host 与特定 participant 或 host 与其他 participants 之间定向转发
- 心跳与超时
- 服务端周期发送 ping客户端回 pong若长时间无活动则断开
```mermaid
sequenceDiagram
participant C as "客户端"
participant S as "WebSocket 信令"
participant H as "处理器(websockethandler)"
C->>S : "connect" {connectionId}
S->>H : onConnect(ws, connectionId)
H-->>C : "connect" {role, polite, participantId}
C->>S : "offer"/"answer"/"candidate"
S->>H : onOffer/onAnswer/onCandidate
H-->>C : 广播/定向转发对应信令
C->>S : "ping"
S-->>C : "pong"
S->>H : 更新 lastActivity
C->>S : "disconnect" {connectionId}
S->>H : onDisconnect
H-->>C : "disconnect"
```
图表来源
- [src/websocket.ts:44-115](file://src/websocket.ts#L44-L115)
- [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:404-430](file://src/class/websockethandler.ts#L404-L430)
章节来源
- [src/websocket.ts:6-118](file://src/websocket.ts#L6-L118)
- [src/class/websockethandler.ts:1-479](file://src/class/websockethandler.ts#L1-L479)
### HTTP 轮询信令 API
- 会话与连接管理
- PUT "":创建会话,返回 sessionId
- DELETE "":删除会话
- PUT "/connection":创建连接,返回 connectionId、polite、type、datetime
- DELETE "/connection":删除连接
- 信令存取
- GET ""获取所有信令connect/disconnect/offer/answer/candidate按 datetime 排序
- GET "/offer":获取 offer 列表(可按 fromtime 过滤)
- GET "/answer":获取 answer 列表(可按 fromtime 过滤)
- GET "/candidate":获取 candidate 列表(可按 fromtime 过滤)
- GET "/connection":获取连接列表
- GET "/connection-ids":获取所有活跃连接 ID
- POST "/offer":提交 offer
- POST "/answer":提交 answer
- POST "/candidate":提交 candidate
- 认证与安全
- 所有受保护路由需携带请求头 "session-id"
- 房间与用户信息
- GET "/rooms":获取房间与用户信息(含 sessionId、connected
```mermaid
flowchart TD
Start(["开始"]) --> CreateSession["PUT '' 创建会话"]
CreateSession --> CreateConn["PUT '/connection' 创建连接"]
CreateConn --> PollLoop["轮询 GET ''/offer/answer/candidate"]
PollLoop --> PostOffer["POST '/offer' 提交 offer"]
PollLoop --> PostAnswer["POST '/answer' 提交 answer"]
PollLoop --> PostCandidate["POST '/candidate' 提交 candidate"]
PostOffer --> PollLoop
PostAnswer --> PollLoop
PostCandidate --> PollLoop
PollLoop --> DeleteConn["DELETE '/connection' 删除连接"]
DeleteConn --> DeleteSession["DELETE '' 删除会话"]
DeleteSession --> End(["结束"])
```
图表来源
- [src/signaling.ts:6-24](file://src/signaling.ts#L6-L24)
- [src/class/httphandler.ts:664-696](file://src/class/httphandler.ts#L664-L696)
- [src/class/httphandler.ts:698-828](file://src/class/httphandler.ts#L698-L828)
- [src/class/httphandler.ts:830-998](file://src/class/httphandler.ts#L830-L998)
- [src/class/httphandler.ts:1041-1076](file://src/class/httphandler.ts#L1041-L1076)
章节来源
- [src/signaling.ts:1-25](file://src/signaling.ts#L1-L25)
- [src/class/httphandler.ts:1-1130](file://src/class/httphandler.ts#L1-L1130)
### 信令消息数据结构
- Offer
- 字段sdp、datetime、polite
- 场景:发起端创建本地 offer 并通过信令通道发送给对端
- Answer
- 字段sdp、datetime
- 场景:应答端收到 offer 后创建 answer 并回传
- Candidate
- 字段candidate、sdpMLineIndex、sdpMid、datetime
- 场景ICE 候选者收集阶段持续发送,帮助建立 P2P 连接
```mermaid
classDiagram
class Offer {
+string sdp
+number datetime
+boolean polite
}
class Answer {
+string sdp
+number datetime
}
class Candidate {
+string candidate
+number sdpMLineIndex
+string sdpMid
+number datetime
}
```
图表来源
- [src/class/offer.ts:1-11](file://src/class/offer.ts#L1-L11)
- [src/class/answer.ts:1-8](file://src/class/answer.ts#L1-L8)
- [src/class/candidate.ts:1-12](file://src/class/candidate.ts#L1-L12)
章节来源
- [src/class/offer.ts:1-11](file://src/class/offer.ts#L1-L11)
- [src/class/answer.ts:1-8](file://src/class/answer.ts#L1-L8)
- [src/class/candidate.ts:1-12](file://src/class/candidate.ts#L1-L12)
### Swagger 自动生成的 API 文档
- 生成与访问
- 初始化 Swagger自动扫描 /src/class/httphandler.ts 与 /src/signaling.ts 中的注释
- 访问地址:/api-docs根据运行协议与端口动态生成
- 安全方案
- sessionAuth通过请求头 "session-id" 进行认证
章节来源
- [src/swagger.ts:16-65](file://src/swagger.ts#L16-L65)
### API 使用示例与集成模板
- 客户端封装
- HTTP 信令封装Signaling 类,提供 start/stop、createConnection/deleteConnection、sendOffer/sendAnswer/sendCandidate、getAll 等方法
- WebSocket 信令封装WebSocketSignaling 类,提供 createConnection/sendOffer/sendAnswer/sendCandidate/sendMessage 等方法
- Peer 连接控制Peer 类,封装 RTCPeerConnection、ICE 候选者、状态变化等
- 示例流程
- HTTP 模式:创建会话 → 创建连接 → 轮询获取信令 → 发送 offer/answer/candidate → 删除连接/会话
- WebSocket 模式:建立连接 → 发送 connect → 发送 offer/answer/candidate → 接收对端信令 → 断开连接
章节来源
- [client/src/signaling.js:1-292](file://client/src/signaling.js#L1-L292)
- [client/src/peer.js:1-188](file://client/src/peer.js#L1-L188)
## 依赖关系分析
- 服务端依赖
- Express、ws、swagger-jsdoc、swagger-ui-express、uuid、cors、morgan、multer
- 关键依赖链
- src/index.ts → src/server.ts → src/signaling.ts → src/class/httphandler.ts
- src/index.ts → src/websocket.ts → src/class/websockethandler.ts
- src/swagger.ts → src/class/httphandler.ts 与 src/signaling.ts
```mermaid
graph LR
pkg["package.json 依赖声明"] --> exp["express"]
pkg --> wsdep["ws"]
pkg --> swagger["swagger-jsdoc / swagger-ui-express"]
pkg --> uuiddep["uuid"]
pkg --> corsdep["cors"]
pkg --> morgandep["morgan"]
pkg --> multerdep["multer"]
idx["src/index.ts"] --> srv["src/server.ts"]
idx --> wsc["src/websocket.ts"]
srv --> sig["src/signaling.ts"]
sig --> hth["src/class/httphandler.ts"]
wsc --> wsh["src/class/websockethandler.ts"]
srv --> swg["src/swagger.ts"]
swg --> hth
swg --> sig
```
图表来源
- [package.json:14-46](file://package.json#L14-L46)
- [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/signaling.ts:1-25](file://src/signaling.ts#L1-L25)
- [src/class/httphandler.ts:1-1130](file://src/class/httphandler.ts#L1-L1130)
- [src/class/websockethandler.ts:1-479](file://src/class/websockethandler.ts#L1-L479)
- [src/swagger.ts:16-65](file://src/swagger.ts#L16-L65)
章节来源
- [package.json:14-46](file://package.json#L14-L46)
- [src/index.ts:13-109](file://src/index.ts#L13-L109)
## 性能考量
- WebSocket
- 低延迟、高吞吐,适合高频信令与实时交互
- 心跳检测与超时断开避免僵尸连接占用资源
- HTTP 轮询
- 增量查询 fromtime 参数减少无效传输
- 会话超时清理机制降低内存占用
- 服务器配置
- 日志级别可调,生产环境建议调整以减少 I/O 开销
- HTTPS 证书启用时建议使用强密码套件与现代 TLS 版本
## 故障排查指南
- 常见错误与处理
- 404 会话不存在:检查 session-id 是否正确传递
- 400 参数缺失:确保请求体包含 connectionId
- 400 连接 ID 已被使用(私有模式):更换唯一 connectionId
- 会话超时:定期轮询或保持 WebSocket 连接活跃
- 测试参考
- WebSocket 单测验证公共/私有模式下的消息转发与断开行为
- HTTP 单测验证会话创建/删除、连接管理、信令存取与超时清理
章节来源
- [test/websockethandler.test.ts:1-191](file://test/websockethandler.test.ts#L1-L191)
- [test/httphandler.test.ts:1-510](file://test/httphandler.test.ts#L1-L510)
## 结论
本项目提供了完整的 WebRTC 信令解决方案,支持 WebSocket 与 HTTP 轮询两种模式,满足不同部署与网络环境需求。通过清晰的 API 规范、完善的 Swagger 文档与客户端封装,开发者可快速集成并稳定运行信令服务。
## 附录
- 端点一览HTTP 轮询)
- GET /signaling/connection-ids获取所有活跃连接 ID
- GET /signaling/connection获取连接列表
- GET /signaling/offer获取 offer 列表(可选 fromtime
- GET /signaling/answer获取 answer 列表(可选 fromtime
- GET /signaling/candidate获取 candidate 列表(可选 fromtime
- GET /signaling获取所有信令可选 fromtime
- PUT /signaling创建会话返回 sessionId
- DELETE /signaling删除会话
- PUT /signaling/connection创建连接
- DELETE /signaling/connection删除连接
- POST /signaling/offer提交 offer
- POST /signaling/answer提交 answer
- POST /signaling/candidate提交 candidate
- GET /signaling/rooms获取房间与用户信息
- 客户端集成要点
- HTTP 模式:使用 Signaling 类管理会话与轮询
- WebSocket 模式:使用 WebSocketSignaling 类进行实时信令
- Peer 控制:使用 Peer 类处理 RTCPeerConnection 生命周期与 ICE 候选者