Skip to content

核心概念

架构概览

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信令协商中
connectingICE 连接建立中
connected已连接disconnect(), dispose()
reconnecting自动重连中disconnect(), dispose()
failed连接失败connect(), dispose()
disposed已销毁

可以通过 rtc.statestatechange 事件获取当前状态:

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 配置覆盖。

Released under the MIT License.