You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
How closely @node-webrtc-rust/sdk matches the browser WebRTC 1.0 APIs (W3C, MDN RTCPeerConnection).
Legend
Symbol
Meaning
✅
Supported for intended use cases
🟡
Partial — API exists but behavior/options differ from the spec
❌
Not implemented
➕
Extension — not in the W3C API (library-specific)
Scope: Node.js server/embedded peers and conference MCU. We do not target full browser parity (no DOM, no getUserMedia, no WebCodecs render path). Goal is predictable interoperability with browser peers for audio + data channels, plus conference mixing.
Summary
Area
Parity
Notes
ICE / SDP negotiation
🟡 ~80%
Offer/answer, trickle ICE, STUN/TURN; several config/offer options missing
Data channels
🟡 ~70%
Send/receive; limited init options and backpressure events
48 kHz stereo PCM → encoded to negotiated codec (Opus for WebRTC)
Prime frame (960 B / 5 ms)
➕
Required so remote ontrack fires — see SDK JSDoc
Video local track
❌
Roadmap v0.2.x
Receive path behavior (important)
Browser: ontrack → attach to <audio> or WebAudio.
node-webrtc-rust:
ontrack fires only after the remote sender calls writeSample at least once (first RTP packet). Negotiation alone is insufficient.
RemoteAudioTrack.readSample() decodes inbound Opus to 48 kHz stereo PCM for app-level processing. The conference crate also decodes internally for MCU mixing.
RTCRtpTransceiver
API
Status
Notes
direction / currentDirection
✅
mid
✅
null before negotiation
stopped
✅
Set on handle after {@link RTCRtpTransceiver.stop}
setDirection()
✅
stop()
✅
sender / receiver
✅
RTCRtpSender & RTCRtpReceiver
API
Status
Notes
RTCRtpSender.track
✅
Updated by replaceTrack
RTCRtpSender.replaceTrack(track)
✅
Audio only; null detaches send
RTCRtpSender.transport
❌
RTCRtpSender.getParameters() / setParameters()
❌
Simulcast/bitrate — roadmap v0.3
RTCRtpReceiver.track
🟡
Use {@link RTCPeerConnection.ontrack}; receiver.track reserved (null today)
RTCRtpReceiver.getStats()
❌
RTCDataChannel
API
Status
Notes
label, ordered, protocol, id
🟡
Init options partially forwarded
maxPacketLifeTime / maxRetransmits
🟡
In init type; verify native SCTP mapping
negotiated
🟡
readyState
✅
send(string | Buffer | ArrayBuffer | Uint8Array)
✅
Buffer passed through on send when already a Buffer
close()
✅
binaryType
✅
'arraybuffer' returns ArrayBuffer on receive; default Buffer
bufferedAmount
✅
Cached property synced from native after send and on low events
bufferedAmountLowThreshold
✅
Forwarded to SCTP stack
onopen / onmessage / onclose / onerror
✅
onbufferedamountlow
✅
send() before open
➕
Queued until native channel ready
Statistics & diagnostics
API
Status
Notes
RTCPeerConnection.getStats()
✅
JSON stats from webrtc-rs → SDK Map
RTCStatsReport types
❌
WEBRTC_DEBUG / config.debug
➕
Call/event tracing
Conference API (@node-webrtc-rust/sdk/conference)
Not part of W3C WebRTC — server-side MCU for multi-participant audio.
API
Status
Notes
ConferenceServer / ConferenceRoom
➕ ✅
Room lifecycle
attachSignalingBridge
➕ ✅
JSON signaling over WS helper
Per-listener mix / exclude-self
➕ ✅
MixGraph in Rust
Global / per-listener mute
➕ ✅
setMixingEnabled
➕ ✅
kickParticipant
➕ ✅
Explicit routing matrix (who hears whom)
✅
MixGraph::set_listener_sources allow-list per listener
Video compositing
❌
Roadmap v0.2.x
Signaling helpers (@node-webrtc-rust/signaling)
API
Status
Notes
SignalingServer
➕ ✅
Room-based SDP/ICE relay
SignalingClient
➕ ✅
autoNegotiate
➕ ✅
Wires two RTCPeerConnections
Recommended parity roadmap
Prioritized for browser interop and your conference product: