核心概念
架构概览
WetRTC 采用门面模式,对外暴露简洁的 WetRTC 类,内部由四个子系统协作:
┌─────────────────────────────────────┐
│ WetRTC │
│ ┌──────────┐ ┌──────────┐ │
│ │ Signal │ │ Media │ │
│ │ Manager │ │ Manager │ │
│ └──────────┘ └──────────┘ │
│ ┌──────────┐ ┌──────────┐ │
│ │ Data │ │ Stats │ │
│ │ Manager │ │ Monitor │ │
│ └──────────┘ └──────────┘ │
│ ┌──────────────────────┐ │
│ │ ConnectionStateMachine│ │
│ └──────────────────────┘ │
│ ┌──────────────────────┐ │
│ │ DisposableStack │ │
│ └──────────────────────┘ │
└─────────────────────────────────────┘连接状态机
WetRTC 使用有限状态机管理连接生命周期,杜绝非法状态调用:
idle ──→ signaling ──→ connecting ──→ connected
│ │ │
└──→ disposed └──→ failed ├──→ reconnecting ──→ connected
│ │ │
└──→ disposed └──→ failed
│
└──→ disposed状态及其含义:
| 状态 | 说明 | 可执行操作 |
|---|---|---|
idle | 初始或已断开 | connect() |
signaling | 信令协商中 | — |
connecting | ICE 连接建立中 | — |
connected | 已连接 | disconnect(), dispose() |
reconnecting | 自动重连中 | disconnect(), dispose() |
failed | 连接失败 | connect(), dispose() |
disposed | 已销毁 | — |
可以通过 rtc.state 或 statechange 事件获取当前状态:
ts
console.log(rtc.state) // 'idle'
rtc.on('statechange', (newState, prev) => {
console.log(`${prev} → ${newState}`)
})事件系统
WetRTC 使用强类型的事件发射器,所有事件都有完整的类型推导:
ts
rtc.on('statechange', (state, prev) => { ... }) // 状态变更
rtc.on('track', (ev: RTCTrackEvent) => { ... }) // 远端媒体流
rtc.on('datachannel', (ch: RTCDataChannel) => { ... }) // 远端 DataChannel
rtc.on('message', (data, channel) => { ... }) // DataChannel 消息
rtc.on('error', (err: WetRTCError) => { ... }) // 错误
rtc.on('reconnecting', (attempt, max) => { ... }) // 重连进度
rtc.on('stats', (snapshot: StatsSnapshot) => { ... }) // 连接统计on() 返回取消监听的函数;使用 off() 取消特定监听器;once() 只触发一次。
资源管理
WetRTC 使用 DisposableStack 模式统一管理所有子系统的生命周期。调用 dispose() 时会逆序释放所有资源:
ts
// 断开连接但保留实例(可重连)
await rtc.disconnect()
// 彻底销毁,释放 RTCPeerConnection、事件监听器、定时器等
rtc.dispose()自动重连
当 ICE 连接意外断开(iceConnectionState === 'disconnected')时,WetRTC 会自动尝试重连。重连策略使用指数退避算法:
ts
const rtc = new WetRTC({
signal,
reconnect: {
maxAttempts: 5, // 最大重试次数
baseDelay: 1000, // 基础延迟 (ms)
maxDelay: 30000, // 最大延迟上限 (ms)
backoffMultiplier: 2, // 退避倍数
}
})默认重连时序:1s → 2s → 4s → 8s → 16s(达到 5 次上限后进入 failed 状态)。
Perfect Negotiation
WetRTC 内置 polite/impolite 协商模式,避免双方同时发起 offer 导致的 glitch 冲突:
ts
// 发送方设为 impolite(默认)
const sender = new WetRTC({ signal, direction: 'sendonly' })
// polite 默认为与 direction 相反
// 接收方设为 polite
const receiver = new WetRTC({ signal, direction: 'recvonly' })默认规则:sendonly → impolite;sendrecv / recvonly → polite。可以通过 polite 配置覆盖。